簡體   English   中英

在Symfony2中上載文件:可捕獲的致命錯誤:參數1傳遞給

[英]Upload file in Symfony2: Catchable Fatal Error: Argument 1 passed to

我使用Symfony2和wamp服務器 我嘗試根據Symfony doc / cookbook實施上載方法

II有兩個實體DocumentsEnsemble.phpEnsembles.php DocumentsEnsembles是我存儲 1個整體的上傳文件 (圖像,doc,pdf等...)的實體。 一個Ensemble可以有0個或多個文檔,並且一個文檔可以屬於0個或1個單個 Ensemble。

這是我的名為Ensembles.php Ensembles實體代碼:

namespace MySpace\DatabaseBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\UploadedFile;

/**
 * Ensembles
 *
 * @ORM\Table(name="ensembles")
 * @ORM\Entity
 */
class Ensembles
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
    * @var string
    *
    * @ORM\Column(name="nom", type="string", length=150, nullable=false)
    */
    private $nom;

    /**
    * @ORM\ManyToOne(targetEntity="Documentsensemble", inversedBy="file")
    * @ORM\JoinColumn(name="documentsensemble_id", referencedColumnName="id", nullable=true)
    */
    private $documentsensemble;

   //the getters and setters

  //implement Upload method
public function preUpload()
    {
        if (null !== $this->file) {
            $this->path = sha1(uniqid(mt_rand(), true)).'.'.$this->file->guessExtension();
        }
    }

    /**
     * @ORM\PostPersist()
     * @ORM\PostUpdate()
     */
    public function upload()
    {
        if (null === $this->file) {
            return;
        }
        $this->file->move($this->getUploadRootDir(), $this->path);

        unset($this->file);
    }

    /**
     * @ORM\PostRemove()
     */
    public function removeUpload()
    {
        if ($file = $this->getAbsolutePath()) {
            unlink($file);
        }
    }

我想實現上載方法,就像您在Ensembles中看到的那樣。 這是名為DocumentsEnsembles.php的DocumentsEnsemble實體:

namespace MySpace\DatabaseBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\UploadedFile;

/**
 * Documentsensemble
 *
 * @ORM\Table(name="documentsensemble")
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class Documentsensemble
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer", nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $id;

/**
 * @ORM\Column(type="string", length=255)
 * @Assert\NotBlank
 */
public $nom;

/**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    public $path; //La propriété path stocke le chemin relatif du fichier et est persistée dans la base de données

    public function getAbsolutePath()
    {
        return null === $this->path ? null : $this->getUploadRootDir().'/'.$this->path;
    }

    public function getWebPath()
    {
        return null === $this->path ? null : $this->getUploadDir().'/'.$this->path;
    }

    protected function getUploadRootDir()
    {
        return __DIR__.'src/MySpace/WelcomeBundle/Ressources/public/image/uploadEnsembles'.$this->getUploadDir();
    }

    protected function getUploadDir()
    {
        return 'uploads/documents';
    }

    /**
     * @Assert\File(maxSize="4M")
     * @ORM\OneToMany(targetEntity="Ensembles", mappedBy="documentsensemble")
     */
    public $file;

   // the getters and setters

在帶有post方法的表單中,我可以在我的Ensembles實體中添加一個整體。 這個表格包含了輸入文件,上傳文件屬於一個整體。 我使用由Doctrine生成的名為EnsemblesType.php的表單,這是以下代碼:

namespace MySpace\DatabaseBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class EnsemblesType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('referenceclient')
            ->add('nom')
            ->add('voie')
            ->add('numerovoie')
            ->add('codepostal')
            ->add('commune')
            ->add('dateactivation','date', array(
                    'widget' => 'single_text',
                    'format' => 'yyyy-MM-dd',
                    'attr' => array('class' => 'datepicker')
                    ))
            ->add('datedesactivation', 'date', array(
                    'widget' => 'single_text',
                    'format' => 'yyyy-MM-dd',
                    'attr' => array('class' => 'datepicker')
                    ))
            ->add('documentsensemble', 'file')
            ->add('parcsimmobilier')
            ->add('systemes')
        ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'MySpace\DatabaseBundle\Entity\Ensembles'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'MySpace_databasebundle_ensembles';
    }
}

這是我的addEnsembles.html.twig ,帶有post方法的形式:

<form action="{{ path('ajouterEnsembles_process') }}" method="post" {{ form_enctype(formEnsemble) }}>
  {{ form_errors(formEnsemble) }}   
  <div>
    {{ form_label(formEnsemble.nom, "Nom de l'ensemble:", {'label_attr': {'class': 'control-label'}}) }}
    {{ form_errors(formEnsemble.nom) }}
    <div>
      {{ form_widget(formEnsemble.nom, {'attr': {'class': 'form-control'}}) }}
    </div>
  </div>
  <br>
  {# Upload #}
  <div class="container">
    <div class="row col-md-12">
      <div class="row col-md-9">
       {{ form_label(formEnsemble.documentsensemble, "Transférer un fichier appartenant à cet ensemble:", {'label_attr': {'class': 'control-label'}}) }}
        <div>
         {{ form_widget(formEnsemble.documentsensemble) }}
        </div>
      </div>
      <br>
      {# validation #}
      <div class="row col-md-3">
        <input type="submit" value="Ajouter" class="btn btn-success"/>
      </div>
    </div>
  </div>
</form>

提交表單時,出現以下錯誤:

可捕獲的致命錯誤:傳遞給MySpace \\ DatabaseBundle \\ Entity \\ Ensembles :: setDocumentsensemble()的參數1必須是MySpace \\ DatabaseBundle \\ Entity \\ Documentsensemble的實例,Symfony \\ Component \\ HttpFoundation \\ File \\ UploadedFile的實例,在C中調用: \\ wamp \\ www \\ BitbucketRepository \\ repos \\ SymfonyGirusMySpace \\ vendor \\ symfony \\ symfony \\ src \\ Symfony \\ Component \\ PropertyAccess \\ PropertyAccessor.php在438行中定義,並在C:\\ wamp \\ www \\ BitbucketRepository \\ repos \\ SymfonyGirusMySpace \\ s \\ DatabaseBundle \\ Entity \\ Ensembles.php第411行

有人可以向我解釋以找到正確的解決方案嗎? 我對上傳文件方法是否正確?

這是我的控制器方法,用於添加帶有上載文件的合奏:

public function addEnsemblesAction() {

        $em=$this->getDoctrine()->getManager();
        $ensemble = new Ensembles;
        $formEnsemble=$this->createForm(new EnsemblesType(), $ensemble);

        $request = $this->getRequest();

            if ($request->isMethod('POST') | ($formEnsemble->isValid())) {

                    $formEnsemble->bind($request);
                    $ensemble = $formEnsemble->getData();

                    $em->persist($ensemble);
                    $em->flush();

                    return $this->redirect($this->generateUrl('showEnsembles'));
                }

            else {
                    return $this->render('MySpaceGestionPatrimoinesBundle:Ensembles:addrEnsembles.html.twig', array('formEnsemble' => $formEnsemble->createView() ));
                 }

}

解決方案的更新問題

感謝Abdallah Arffak的回​​答和評論

實際上,我更改了兩個實體之間的關系。 實際上,上傳方法必須在Documentsensemble.php中。

這是Ensembles.php的代碼:

namespace MySpace\DatabaseBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\UploadedFile;

/**
 * Ensembles
 *
 * @ORM\Table(name="ensembles")
 * @ORM\Entity
 */
class Ensembles
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
    * @var string
    *
    * @ORM\Column(name="nom", type="string", length=150, nullable=false)
    */
    private $nom;

    // The getters and setters

現在使用上載方法(回調等...)的Documentsensembles.php代碼:

namespace MySpace\DatabaseBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\UploadedFile;

/**
 * Documentsensemble
 *
 * @ORM\HasLifecycleCallbacks
 * @ORM\Table(name="documentsensemble", indexes={@ORM\Index(name="IDX_674FC05E5BA556D3", columns={"ensembles_id"})})
 * @ORM\Entity
 */
class Documentsensemble
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="nom", type="string", length=255, nullable=false)
     * @Assert\NotBlank
     */
    private $nom;

    /**
     * @var string
     *
     * @ORM\Column(name="path", type="string", length=255, nullable=true)
     */
    private $path; //stocke le chemin relatif du fichier et est persistée dans la base de données


    /**
    * @Assert\File(maxSize="6000000")
    */
    public $file;

    // UPLOAD
        public function getWebPath()
        {
            return null === $this->path ? null : $this->getUploadDir().'/'.$this->path;
        }

        protected function getUploadRootDir()
        {
            // le chemin absolu du répertoire où les documents uploadés doivent être sauvegardés
            return __DIR__.'/../../../../MySpace/'.$this->getUploadDir();
        }

        protected function getUploadDir()
        {
            // on se débarrasse de « __DIR__ » afin de ne pas avoir de problème lorsqu'on affiche le document/image dans la vue.
            return 'uploads/documentsEnsemble';
        }

        // propriété utilisé temporairement pour la suppression
        private $filenameForRemove;

        /**
         * @ORM\PrePersist()
         * @ORM\PreUpdate()
         */
        public function preUpload()
        {
            if (null !== $this->file) {
                $this->path = $this->file->guessExtension();
            }
        }

        /**
         * @ORM\PostPersist()
         * @ORM\PostUpdate()
         */
        public function upload()
        {
            if (null === $this->file) {
                return;
            }

            // lancer une exception ici si le fichier ne peut pas être déplacé afin que l'entité ne soit pas persistée dans la base de données comme le fait la méthode move() de UploadedFile
            $this->file->move($this->getUploadRootDir(), $this->nom.'.'.$this->file->guessExtension());

            unset($this->file);
        }

        /**
         * @ORM\PreRemove()
         */
        public function storeFilenameForRemove()
        {
            $this->filenameForRemove = $this->getAbsolutePath();
        }

        /**
         * @ORM\PostRemove()
         */
        public function removeUpload()
        {
            if ($this->filenameForRemove) {
                unlink($this->filenameForRemove);
            }
        }

        public function getAbsolutePath()
        {
            return null === $this->path ? null : $this->getUploadRootDir().'/'.$this->nom.'.'.$this->path = $this->file->guessExtension();
        }
        // The getters and the setters

現在是控制器的代碼:

public function uploadAction() {

        $message = "Infos: aucun documents uploadé présent pour le moment";
        $em=$this->getDoctrine()->getManager();
        $documentsensemble = $em->getRepository('MySpaceDatabaseBundle:Documentsensemble');

        $documentsensemble = new Documentsensemble();
        $formUpload = $this->createForm(new DocumentsensembleType(), $documentsensemble);


        $requestUpload = $this->getRequest();

        //instruction if à plusieurs conditions: ici si la method est POST et si le formulaire est valide
        if ($requestUpload->isMethod('POST') | ($formUpload->isValid())) {

                $formUpload->bind($requestUpload);
                $documentsensemble = $formUpload->getData();
                //$documentsensemble->upload();
                //Cette ligtne est commenté car nous utilisons les callbacks pour la méthode Upload de Symfony

                $em->persist($documentsensemble);
                $em->flush();

                return $this->redirect($this->generateUrl('MySpace_formulaire_recherche_ensembles'));
            }

        //retourner le formulaire d'ajout si c'est invalide
        else {
                return $this->render('MySpaceGestionPatrimoinesBundle:Ensembles:documentsensemble.html.twig', array('formUpload' => $formUpload->createView(), 'message' => $message ));
             }

    }

最后,我用另一種形式用細枝稱呼該表格,有很多方法和方法,請查看symfony食譜此處 ,例如Abdallah Arffak建議我。

非常感謝您,如果我的英語不好,抱歉。

你應該用這個

{{ form_label(formEnsemble.file, "Transférer un fichier appartenant à cet ensemble:", {'label_attr': {'class': 'control-label'}}) }}
        <div>
         {{ form_widget(formEnsemble.file) }}
        </div>
      </div>

代替這個

{{ form_label(formEnsemble.documentsensemble, "Transférer un fichier appartenant à cet ensemble:", {'label_attr': {'class': 'control-label'}}) }}
        <div>
         {{ form_widget(formEnsemble.documentsensemble) }}
        </div>
      </div>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM