可捕获的致命错误:参数1传递给了?Symfon2.1


Catchable Fatal Error: Argument 1 passed to ? Symfony2.1

我被这个错误阻止了:

可捕获的致命错误:参数1传递给Joker''CoreBundle''Entity''Incidentfile::setFile()必须是的实例Symfony''Component''HttpFoundation''File''UploadedFile,给定字符串,调入/Applications/MAMP/htdocs/joker repo/vendor/symfony/symfoy/src/symfony/Component/Form/Util/PropertyPath.php第538行,定义于/Applications/MAMP/htdocs/joker repo/src/joker/CoreBundle/Entity/Incidentfile.php157线

在我的实体中,我有用于File的setter和getter。我用这种方法制作文件上传:this

文件夹上传图片也有权限问题,但在我解决后,一切都很好,但现在出了问题。

这是实体

/**
 * Incidentfile
 *
 * @ORM'Table()
 * @ORM'Entity(repositoryClass="Joker'CoreBundle'Entity'IncidentfileRepository")
 * @ORM'HasLifecycleCallbacks
 */
class Incidentfile
{
//
//    /**
//     * @ORM'ManyToOne(targetEntity="Incidentlist", inversedBy="ListFiles")
//     * @ORM'JoinColumn(name="IncidentListId", referencedColumnName="id")
//     */
//    protected $FileList;
    /**
     * @var integer
     *
     * @ORM'Column(name="id", type="integer")
     * @ORM'Id
     * @ORM'GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @var 'DateTime
     *
     * @ORM'Column(name="createdat", type="datetime")
     */
    private $createdat;
    /**
     * Image path
     *
     * @var string
     *
     * @ORM'Column(type="text", length=255, nullable=false)
     */
    protected $path;
    /**
     * Image file
     *
     * @var File
     *
     * @Assert'File(
     *     maxSize = "5M",
     *     mimeTypes = {"image/jpeg", "image/gif", "image/png", "image/tiff"},
     *     maxSizeMessage = "The maxmimum allowed file size is 5MB.",
     *     mimeTypesMessage = "Only the filetypes image are allowed."
     * )
     */
    protected $file;
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Set createdat
     *
     * @param 'DateTime $createdat
     * @return Incidentfile
     */
    public function setCreatedat($createdat)
    {
        $this->createdat = $createdat;
        return $this;
    }
    /**
     * Get createdat
     *
     * @return 'DateTime 
     */
    public function getCreatedat()
    {
        return $this->createdat;
    }
    /**
     * Called before saving the entity
     *
     * @ORM'PrePersist()
     * @ORM'PreUpdate()
     */
    public function preUpload()
    {
        if (null !== $this->file) {
            // do whatever you want to generate a unique name
            $filename = sha1(uniqid(mt_rand(), true));
            $this->path = $filename.'.'.$this->file->guessExtension();
        }
    }
    /**
     * Called before entity removal
     *
     * @ORM'PreRemove()
     */
    public function removeUpload()
    {
        if ($file = $this->getAbsolutePath()) {
            unlink($file);
        }
    }
    public function getWebPath()
    {
        return null === $this->path
            ? null
            : $this->getUploadDir().'/'.$this->path;
    }
    /**
     * Called after entity persistence
     *
     * @ORM'PostPersist()
     * @ORM'PostUpdate()
     */
    protected function getUploadRootDir()
    {
        // the absolute directory path where uploaded
        // documents should be saved
        return __DIR__.'/../../../../web/'.$this->getUploadDir();
    }
    protected function getUploadDir()
    {
        // get rid of the __DIR__ so it doesn't screw up
        // when displaying uploaded doc/image in the view.
        return 'uploaded_images';
    }
    /**
     * Sets file.
     *
     * @param UploadedFile $file
     */
    public function setFile(UploadedFile $file = null)
    {    if (null === $file) {
        return;
    }
        $this->file = $file;
        if(in_array($file->getMimeType(),array("image/jpeg", "image/gif", "image/png", "image/tiff"))){
            $filename=rand(100000,1000000).'_'.$file->getClientOriginalName();
            $file->move($this->getUploadRootDir(),$filename
            );
            $this->path =$filename;
            $this->file = null;
        }
        else $this->path=null;
    }
    /**
     * Get file.
     *
     * @return UploadedFile
     */
    public function getFile()
    {
        return $this->file;
    }
    public function upload() {
        // the file property can be empty if the field is not required
        if (null === $this->getFile()) {
            return;
        }
        $file=$this->getFile();
        $filename=rand(100000,1000000).'_'.$file->getClientOriginalName();
        // we use the original file name here but you should
        // sanitize it at least to avoid any security issues
        // move takes the target directory and target filename as params
        $file->move($this->getUploadRootDir(),$filename
        );
        // set the path property to the filename where you've saved the file
        $this->path =$filename;
        // clean up the file property as you won't need it anymore
        $this->setFile(null);
    }
    /**
     * Set path
     *
     * @param string $path
     * @return Incidentfile
     */
    public function setPath($path)
    {
        $this->path = $path;
        return $this;
    }
    /**
     * Get path
     *
     * @return string
     */
    public function getPath()
    {
        return $this->path;
    }
    /**
     * Set FileList
     *
     * @param 'Joker'CoreBundle'Entity'Incidentlist $fileList
     * @return Incidentfile
     */
    public function setFileList('Joker'CoreBundle'Entity'Incidentlist $fileList = null)
    {
        $this->FileList = $fileList;
        return $this;
    }
    /**
     * Get FileList
     *
     * @return 'Joker'CoreBundle'Entity'Incidentlist 
     */
    public function getFileList()
    {
        return $this->FileList;
    }

}

这是我的控制器:

public function TestAction(Request $request){
        $incfileRepo = new Incidentfile();
        $formfile = $this->createForm(new IncfileType(), $incfileRepo);

        if ($request->isMethod('POST')) {
            $formfile->bind($request);
            if ($formfile->isValid()) {

                $em = $this->getDoctrine()->getManager();
                $em->persist($incfileRepo);
                $em->flush();
                return $this->redirect($this->generateUrl('incident_show'));
            }
        }
        $spotEntity = $this->getCurrentSpot();
        $sentryEntity = $this->getCurrentSentry();
        $messagesCollection = $this->getDoctrine()->getRepository('JokerCoreBundle:Message')->findBy(array(
            'spot'  =>  $spotEntity,
            'sentry'    =>  $sentryEntity
        ), array(
            'sent_date' =>  'DESC'
        ));
        return $this->render('JokerAdminBundle:incidents:addfullform.html.twig', $this->getViewConstants(array(
            'formfile'=>$formfile->createView(),
            'spot'  =>  $spotEntity,
            'sentry'    =>  $sentryEntity,
            'messagesCollection'    =>  $messagesCollection,
        )));

    }

树枝中的形状:

 <form action="" method="post">
                    {{ form_rest(formfile) }}
                    <div class="singleTableForm">
                        <input style="float: left; margin-left: 338px; " type="submit" name="" class="button" value="Add" />
                    </div>
                </form>

我发现了问题所在。。树枝上有问题:

<form action="" method="post" {{ form_enctype(formfile) }}>

只需添加**{{ form_enctype(formfile) }}**

您必须添加注释

/**
 * @ORM'PostPersist()
 * @ORM'PostUpdate()
 */
public function upload()

查看更多http://symfony.com/doc/current/cookbook/doctrine/file_uploads.html

并显示表单代码

UPD:最好的方法-使用标签{{ form_start(form) }}{{ form_end(form) }}它还可以保护您免受csrf攻击