2014-10-11 55 views
2

我正在尝试上传基于VichUploaderBundle的文件。 我实现它,当这个错误:当通过VichUploaderBundle上传文件时发生ContextErrorException

ContextErrorException: Catchable Fatal Error: Argument 1 passed to Minn\AdsBundle\Entity\MotorsAdsFile::setFile() must be an instance of Symfony\Component\HttpFoundation\File\File, string given,... 

我知道问题出在方法setFile给定参数的()类。但是,我在github的文档中发现了这个问题。

所以,这就是我所做的&我希望我能解决问题!捆绑我的档案实体的

vich_uploader: 
    db_driver: orm # or mongodb or propel or phpcr 
    mappings: 
     motors_files: 
      uri_prefix:   /files/motors 
      upload_destination: %kernel.root_dir%/../web/files/motors 
      namer: vich_uploader.namer_origname 
      delete_on_remove: true 

定义的

配置

<?php 

namespace Minn\AdsBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\HttpFoundation\File\File; 
use Symfony\Component\Validator\Constraints as Assert; 
use Vich\UploaderBundle\Mapping\Annotation as Vich; 

/** 
* @ORM\Entity 
* @Vich\Uploadable 
*/ 
class MotorsAdsFile { 

    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    public $id; 

    /** 
    * @Assert\File(
    *  maxSize="5M", 
    *  mimeTypes={"image/png", "image/jpeg"} 
    *) 
    * @Vich\UploadableField(mapping="motors_files", fileNameProperty="file") 
    * note: This is not a mapped field of entity metadata, just a simple property. 
    * @var File $file 
    */ 
    protected $file; 

    /** 
    * @ORM\Column(type="string", length=255, name="name") 
    * @var string $name 
    */ 
    protected $name; 

    /** 
    * If manually uploading a file (i.e. not using Symfony Form) ensure an instance 
    * of 'UploadedFile' is injected into this setter to trigger the update. If this 
    * bundle's configuration parameter 'inject_on_load' is set to 'true' this setter 
    * must be able to accept an instance of 'File' as the bundle will inject one here 
    * during Doctrine hydration. 
    * 
    * @param File|\Symfony\Component\HttpFoundation\File\UploadedFile $file 
    */ 
    public function setFile(File $file) { 
     $this->file = $file; 
    } 

    /** 
    * @return File 
    */ 
    public function getFile() { 
     return $this->file; 
    } 

    /** 
    * @param string $name 
    */ 
    public function setName($name) { 
     $this->name = $name; 
    } 

    /** 
    * @return string 
    */ 
    public function getName() { 
     return $this->name; 
    } 

} 

嫩枝一部分的形式

<form action="{{ path('minn_ads_motors_test6') }}" {{ form_enctype(form) }} method="POST"> 
    {{ form_widget(form) }} 
    <div> 
     <input type="submit" value="do it with VICH" /> 
    </div> 
</form> 

我的行为()在我的控制器

public function motorstest6Action(Request $request) { 
    $document = new MotorsAdsFile(); 
    $form = $this->createFormBuilder($document) 
      ->add('name') 
      ->add('file') 
      ->getForm(); 

    $form->handleRequest($request); 

    if ($form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($document); 
     $em->flush(); 

     return $this->redirect($this->generateUrl('minn_ads_default_index')); 
    } 
    return $this->render('MinnAdsBundle:Motors:adddoc1.html.twig', array(
       'form' => $form->createView())); 
} 

回答

2

您的实体配置不正确。为了使这个包能够工作,实体必须有两个字段来表示文件:一个用于存储File对象(未由doctrine进行映射),另一个用于存储其名称(作为字符串,由doctrine进行映射)。 您的实体只有第一个字段。

这里是你如何定义它:

<?php 

namespace Minn\AdsBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\HttpFoundation\File\File; 
use Symfony\Component\Validator\Constraints as Assert; 
use Vich\UploaderBundle\Mapping\Annotation as Vich; 

/** 
* @ORM\Entity 
* @Vich\Uploadable 
*/ 
class MotorsAdsFile { 

    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    public $id; 

    /** 
    * @Assert\File(
    *  maxSize="5M", 
    *  mimeTypes={"image/png", "image/jpeg"} 
    *) 
    * @Vich\UploadableField(mapping="motors_files", fileNameProperty="filename") 
    * note: This is not a mapped field of entity metadata, just a simple property. 
    * @var File $file 
    */ 
    protected $file; 

    /** 
    * @ORM\Column(type="string", length=255, name="filename") 
    * @var string $filename 
    */ 
    protected $filename; 

    /** 
    * @ORM\Column(type="string", length=255, name="name") 
    * @var string $name 
    */ 
    protected $name; 

    /** 
    * If manually uploading a file (i.e. not using Symfony Form) ensure an instance 
    * of 'UploadedFile' is injected into this setter to trigger the update. If this 
    * bundle's configuration parameter 'inject_on_load' is set to 'true' this setter 
    * must be able to accept an instance of 'File' as the bundle will inject one here 
    * during Doctrine hydration. 
    * 
    * @param File|\Symfony\Component\HttpFoundation\File\UploadedFile $file 
    */ 
    public function setFile(File $file) { 
     $this->file = $file; 
    } 

    /** 
    * @return File 
    */ 
    public function getFile() { 
     return $this->file; 
    } 

    /** 
    * @param string $filenname 
    */ 
    public function setFilename($filename) { 
     $this->filename = $filename; 
    } 

    /** 
    * @return string 
    */ 
    public function getFilename() { 
     return $this->file; 
    } 

    /** 
    * @param string $name 
    */ 
    public function setName($name) { 
     $this->name = $name; 
    } 

    /** 
    * @return string 
    */ 
    public function getName() { 
     return $this->name; 
    } 
} 

注意新filename领域,在UploadableField注释的filenameProperty选项的新值。

+0

干得好的朋友! :) – 2014-10-11 12:14:09