Php 使用LifecycleCallbacks时找不到该文件

Php 使用LifecycleCallbacks时找不到该文件,php,symfony,orm,doctrine,assert,Php,Symfony,Orm,Doctrine,Assert,我在symfony2中遇到了表单验证问题 在我的例子中,$form->isValid()命令导致无法找到文件。即使我在填写表单时提供了一个文件 另外,对文档实体中的设置文件函数进行调试,得出文件值设置正确的结论。设置文件功能和打印结果如下所示: /** * Sets file. * * @param UploadedFile $file */ public function setFile(UploadedFile $file = null) { $this->file =

我在
symfony2
中遇到了
表单验证问题

在我的例子中,
$form->isValid()
命令导致
无法找到文件。
即使我在填写表单时提供了一个文件

另外,对
文档实体
中的
设置文件
函数进行调试,得出文件值设置正确的结论。设置文件功能和打印结果如下所示:

/**
 * Sets file.
 *
 * @param UploadedFile $file
 */
public function setFile(UploadedFile $file = null)
{
    $this->file = $file;
    print_r($this->file); // [THIS IS FOR TEST]
    // check if we have an old image path
    if (is_file($this->getAbsolutePath())) {
        // store the old name to delete after the update
        $this->temp = $this->getAbsolutePath();
    } else {
        $this->link = 'initial';
    }
}
打印结果:

Symfony\Component\HttpFoundation\File\UploadedFile Object ( [test:Symfony\Component\HttpFoundation\File\UploadedFile:private] => [originalName:Symfony\Component\HttpFoundation\File\UploadedFile:private] => firefox.exe [mimeType:Symfony\Component\HttpFoundation\File\UploadedFile:private] => application/octet-stream [size:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 338032 [error:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 0 [pathName:SplFileInfo:private] => C:\wamp\tmp\php9DC3.tmp [fileName:SplFileInfo:private] => php9DC3.tmp ) 
我的问题是,为什么即使文件提供正确,表单验证程序也会失败?

当我注释掉我的
setFile()
函数的一部分时,它开始工作,导致移动异常

"

我的班级:

<?php

namespace AppBundle\Form;

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

class DocumentsType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('marker')
            ->add('document_date', 'date', array('widget' => 'single_text', 'format' => 'yyyy-MM-dd'))
            ->add('file', 'file')
            ->add('notes', 'text', array('required' => "false"))
        ;
    }
我的文件类别:

    <?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\UploadedFile;

/**
 * @ORM\Entity
  * @ORM\HasLifecycleCallbacks
 * @ORM\Table(name="Documents")
 */

class Documents
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="Books", inversedBy="documents")
     * @ORM\JoinColumn(name="book_id", referencedColumnName="id")
     */
    protected $book;

    /**
     * @ORM\Column(type="string", length=220)
     */
    protected $marker;

    /**
     * @ORM\Column(type="date", length=220)
     */
    protected $document_date;

    /**
     * @ORM\Column(type="string", length=220)
     * @Assert\File(maxSize="6000000")
     */
     protected $link;

     /**
     * @ORM\Column(type="text")
     */
     protected $notes;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set marker
     *
     * @param string $marker
     * @return Documents
     */
    public function setMarker($marker)
    {
        $this->marker = $marker;

        return $this;
    }

    /**
     * Get marker
     *
     * @return string 
     */
    public function getMarker()
    {
        return $this->marker;
    }

    /**
     * Set document_date
     *
     * @param \DateTime $documentDate
     * @return Documents
     */
    public function setDocumentDate($documentDate)
    {
        $this->document_date = $documentDate;

        return $this;
    }

    /**
     * Get document_date
     *
     * @return \DateTime 
     */
    public function getDocumentDate()
    {
        return $this->document_date;
    }

    /**
     * Set link
     *
     * @param string $link
     * @return Documents
     */
    public function setLink($link)
    {
        $this->link = $link;

        return $this;
    }

    /**
     * Get link
     *
     * @return string 
     */
    public function getLink()
    {
        return $this->link;
    }


    /**
     * Set notes
     *
     * @param string $notes
     * @return Documents
     */
    public function setNotes($notes)
    {
        $this->notes = $notes;

        return $this;
    }

    /**
     * Get notes
     *
     * @return string 
     */
    public function getNotes()
    {
        return $this->notes;
    }

    /**
     * Set book
     *
     * @param \AppBundle\Entity\Books $book
     * @return Documents
     */
    public function setBook(\AppBundle\Entity\Books $book = null)
    {
        $this->book = $book;

        return $this;
    }

    /**
     * Get book
     *
     * @return \AppBundle\Entity\Books 
     */
    public function getBook()
    {
        return $this->book;
    }

    /*
    * ### FILE UPLOAD PROCESS ### 
    */

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

    /**
     * Stores temporay path
     */
     private $temp;

    /**
     * Sets file.
     *
     * @param UploadedFile $file
     */
    public function setFile(UploadedFile $file = null)
    {
        $this->file = $file;
        print_r($this->file); // [THIS IS FOR TEST]
        // check if we have an old image path
        if (is_file($this->getAbsolutePath())) {
            // store the old name to delete after the update
            $this->temp = $this->getAbsolutePath();
        } else {
            $this->link = 'initial';
        }
    }

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

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

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

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

    protected function getUploadRootDir()
    {
        // the absolute directory  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 'uploads/documents';
    }

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

        // check if we have an old image
        if (isset($this->temp)) {
            // delete the old image
            unlink($this->temp);
            // clear the temp image path
            $this->temp = null;
        }

        // you must throw an exception here if the file cannot be moved
        // so that the entity is not persisted to the database
        // which the UploadedFile move() method does
        $this->getFile()->move(
            $this->getUploadRootDir(),
            $this->id.'.'.$this->getFile()->guessExtension()
        );

        $this->setFile(null);
    }


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

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

}

我发现了问题所在。我已将“链接”列标记为文件,因此验证程序失败,因为链接是文本而不是文件

我的链接代码是:

/**
 * @ORM\Column(type="string", length=220)
 * @Assert\File(maxSize="6000000")
 */
 protected $link;
这句话:

 * @Assert\File(maxSize="6000000")
不应该在那里

/**
 * @ORM\Column(type="string", length=220)
 * @Assert\File(maxSize="6000000")
 */
 protected $link;
 * @Assert\File(maxSize="6000000")