Неопределенное свойство файла при выполнении загрузки - PullRequest
5 голосов
/ 10 сентября 2011

У меня есть проблема с загрузкой Symfony 2.Я делаю менеджер слайд-шоу, и я могу загрузить новый слайд (с файлом изображения), но файл свойств $ моего класса «Слайд-шоу» не распознается во время загрузки!

Я следовал за этим tutorial и я использую обратные вызовы жизненного цикла доктрины.

Вот мой класс:

<?php
namespace Sybio\AppBundle\Entity;

use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\Translatable\Translatable;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints as DoctrineAssert;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\MinLength;

use Symfony\Component\HttpFoundation\File\UploadedFile;

/**
 * @ORM\Entity(repositoryClass="Sybio\AppBundle\Entity\Repository\SlideshowRepository")
 * @ORM\Table(name="slideshow")
 * @ORM\HasLifecycleCallbacks
 */
class Slideshow implements Translatable
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @Assert\File(maxSize="1048576")
     */
    protected $file;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    protected $path;

    /**
     * @Gedmo\Locale
     */
    private $locale;

    //Other properties not shown in this paste...

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

    /**
     * Set file
     *
     * @param file $file
     */
    public function setFile($file)
    {
        $this->file = $file;
    }

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

    /**
     * Set path
     *
     * @param string $path
     */
    public function setPath($path)
    {
        $this->path = $path;
    }

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

    /**
     * Set local
     * 
     * @param string $locale
     */
    public function setTranslatableLocale($locale)
    {
        $this->locale = $locale;
    }

    // Others getter and setter methods not shown in this paste ...

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

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

    /**
     * getUploadRootDir
     */
    public function getUploadRootDir()
    {
        return __DIR__.'/../../../../web'.$this->getUploadDir();
    }

    /**
     * getUploadDir of slideshow
     */
    public function getUploadDir()
    {
        return '/uploads/slideshow/'.$this->createdAt->format("Y/m/d");
    }

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

    /**
     * @ORM\PostPersist()
     * @ORM\PostUpdate()
     */
    public function upload()
    {
        if (null !== $this->file) {
            $this->setPath(uniqid().'.'.$this->file->guessExtension());
        }

        if (null === $this->file) {
            return;
        }

        if (!is_dir($this->getUploadRootDir())) {
            mkdir($this->getUploadRootDir(), 777, true);
        }

        $this->file->move($this->getUploadRootDir(), $this->path);

        unset($this->file);
    }

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

Теперь при загрузке вы можете увидеть мою ошибку:

Примечание: неопределенное свойство: Sybio \ AppBundle \ Entity \ Slideshow :: $ file в /home/sybio/www/games/src/Sybio/AppBundle/Entity/Slideshow.php строка 323

Строка, соответствующая методу:

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

Если я изменю «$ this-> file» на «$ this-> getFile ()», у меня будет та же ошибка, но она появляется в получателе$ file.

Если я использую метод get в действии, он работает и возвращает объект UploadedFile.Если я помещаю переменную var_dump из $ this-> file в метод setter, а затем "exit;", это тоже работает!

И, как вы можете видеть, мой класс похож на учебник !!

Есть какое-нибудь решение?

Ответы [ 3 ]

9 голосов
/ 05 декабря 2011

Вот ответ, у меня работает!;)

наконец я исправил проблему.При использовании LifecycleCallbacks вам больше не нужно вызывать метод загрузки в вашем контроллере, иначе это вызовет ошибку.

Источник: http://forum.symfony -project.org / viewtopic.php? F= 23 & т = 35933

3 голосов
/ 13 января 2012

Попробуйте удалить $entity->upload(); в вашем действии

0 голосов
/ 19 июня 2014

Изменение unset($this->file); на $this->file = null;

...