Сериализация «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. ); } /** 

в сериализации (array (object (User), true, array (object (Role)), array ())) в / home / kevin / www / sf2 / vendor / symfony / symfony / src / Symfony / Component / Security / Core /Authentication/Token/AbstractToken.php в строке 155

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

Итак, почему эта ошибка возникает?

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

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