Сериализация Symfony\Component\HttpFoundation\File\UploadedFile не допускается

Эта ошибка возникает, когда я пытаюсь загрузить плохой файл, который не соответствует изображению. Только изображения принимаются.

объект пользователя:

<?php

namespace Test\BackBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * User
 *
 * @ORM\Table(name="user")
 * @ORM\Entity
 * @UniqueEntity(
 *     fields={"email"},
 *     message="This email already exists."
 *  )
 */
class User implements UserInterface
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

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

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

    /**
     * @var string
     *
     * @ORM\Column(name="job", type="string", length=255, nullable=true)
     */
    private $job;

    /**
     * @var string
     *
     * @ORM\Column(name="email", type="string", length=255, unique=true)
     * @Assert\Email()
     */
    private $email;

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

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

    /**
     * @var array
     *
     * @ORM\Column(name="roles", type="array")
     * @Assert\NotBlank()
     */
    private $roles;

    /**
     * @var boolean
     *
     * @ORM\Column(name="isActive", type="boolean")
     */
    private $isActive;

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

    /**
     * @var string
     *
     * @Assert\Image()
     */
    public $file;

    public function __construct()
    {
        $this->isActive = true;
        $this->salt = md5(uniqid(null, true));
    }

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

    /**
     * Set lastName
     *
     * @param string $lastName
     * @return User
     */
    public function setLastName($lastName)
    {
        $this->lastName = $lastName;

        return $this;
    }

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

    /**
     * Set firstName
     *
     * @param string $firstName
     * @return User
     */
    public function setFirstName($firstName)
    {
        $this->firstName = $firstName;

        return $this;
    }

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

    /**
     * Set job
     *
     * @param string $job
     * @return User
     */
    public function setJob($job)
    {
        $this->job = $job;

        return $this;
    }

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

    /**
     * Set email
     *
     * @param string $email
     * @return User
     */
    public function setEmail($email)
    {
        $this->email = $email;

        return $this;
    }

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

    /**
     * Set password
     *
     * @param string $password
     * @return User
     */
    public function setPassword($password)
    {
        $this->password = $password;

        return $this;
    }

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

    /**
     * Set salt
     *
     * @param string $salt
     * @return User
     */
    public function setSalt($salt)
    {
        $this->salt = $salt;

        return $this;
    }

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

    /**
     * Set role
     *
     * @param array $role
     * @throws \InvalidArgumentException
     * @return User
     */
    public function setRoles($role)
    {
        if(array_diff($role, array("ROLE_SUPER_ADMIN", "ROLE_ADMIN", "ROLE_CUSTOMER"))) {
            throw new \InvalidArgumentException("Bad role");
        }
        $this->roles = $role;

        return $this;
    }

    /**
     * Get role
     *
     * @return array 
     */
    public function getRoles()
    {
        return $this->roles;
    }

    /**
     * Set isActive
     *
     * @param boolean $isActive
     * @return User
     */
    public function setIsActive($isActive)
    {
        $this->isActive = $isActive;

        return $this;
    }

    /**
     * Get isActive
     *
     * @return boolean 
     */
    public function getIsActive()
    {
        return $this->isActive;
    }

    /**
     * @inheritDoc
     */
    public function eraseCredentials()
    {
    }

    /**
     * Set username
     *
     * @param string $email
     *
     * @return string
     */
    public function setUsername($email)
    {
        $this->email = $email;

        return $this;
    }

    /**
     * Get username
     *
     * @return string
     */
    public function getUsername()
    {
        return $this->email;
    }

    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__.'/../../../../web/'.$this->getUploadDir();
    }

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

    public function upload()
    {
        if (null === $this->file) {
            return;
        } else {
            $this->path = $this->firstName.'_'.$this->lastName.'_'.sha1(uniqid(mt_rand(), true)).'.'.$this->file->guessExtension();
        }

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

        $this->file = null;
    }

    public function getPath()
    {
        return $this->getWebPath();
    }
}

UserType:

$builder
    ->add('firstName', 'text', array(
                    'required' => true
                ))
     ->add('lastName', 'text', array(
                    'required' => true
                ))
     ->add('email', 'email', array(
                    'required' => true
                ))
     ->add('job', 'text', array(
                    'required' => false
                ))
     ->add('file', 'file', array(
                    'label' => false,
                    'required' => false,
                ))
            ;

контроллер:

    public function updateMyAccountAction($id, Request $request)
    {
        $entityManager = $this->get('doctrine')->getManager();

        $user = $this->get('doctrine')
            ->getRepository('TestBackBundle:User')
            ->find($id);

        if (!$user) {
            throw $this->createNotFoundException('Unable to find User entity.');
        }

        $editForm = $this->createForm(new UserType(), $user);

        $editForm->handleRequest($request);

        if ($editForm->isValid()) {

            $user->upload();

            $entityManager->persist($user);
            $entityManager->flush();
            $this->get('session')->getFlashBag()->add('success', 'Your profile has been updated');

            return $this->redirect($this->generateUrl('my_account', array('id' => $id)));
        } else {
            $this->get('session')->getFlashBag()->add('error', 'Erreur');

            return $this->redirect($this->generateUrl('my_account', array('id' => $id)));
        }
    }

Когда я пытаюсь проверить, работает ли обновление изображения, например, файла PDF, возникает эта ошибка. Файл не обновляется, так что это хорошо. Но моя флэш-сумка и перенаправление в моем контроллере не работают... если я пишу var_dump("test") в остальном в моем контроллере "test" отображается сообщение об ошибке, и Symfony обнаруживает, что форма недействительна.

Это часть трассировки стека при возникновении ошибки:

в /home/user/www/sf2/vendor/symfony/symfony/src/Symfony/Component/Security/Core/Authentication/Token/AbstractToken.php в строке 155

152.                $this->roles,
153.                $this->attributes
154.            )
155.        );
    }
    /**

при сериализации (массив (объект (пользователь), истина, массив (объект (роль)), массив ())) в /home/kevin/www/sf2/vendor/symfony/symfony/src/Symfony/Component/Security/Core/Authentication/Token/AbstractToken.php в строке 155

Читая его, я чувствую, что существует проблема с атрибутом role для его сериализации, потому что это массив (мы должны объявить этот атрибут как реализацию массива). UserInterface)

Так почему эта ошибка происходит?

2 ответа

Решение

Я нашел решение: мне пришлось реализовать Serializable интерфейс, как это: официальный документ

Немного дополнительной точности в словах DOZ:

Лучше реализовать \Serializable в вашем изображении (или в файле, или в @Vich\Uploadable), а не в орудии \Serializable на User Entity, потому что в этом случае вы, вероятно, сломаете логин

Если вы используете VichUploader, как я, не добавляйте \Serializable на вашем пользовательском объекте и добавьте его на свой @Vich\Uploadable (Изображение или файл) Сущность и два метода:

/** @see \Serializable::serialize() */
public function serialize()
{
    return serialize(array(
        $this->id,
        $this->image,
    ));
}

/** @see \Serializable::unserialize() */
public function unserialize($serialized)
{
    list (
        $this->id,
        $this->image,
    ) = unserialize($serialized, array('allowed_classes' => false));
}
Другие вопросы по тегам