Symfony 2 | Exceção de formulário ao modificar um object que tenha um campo de arquivo (imagem)

Estou usando o Symfony2. Eu tenho um Post de entidade que tem um título e um campo de imagem.

Meu problema: tudo está bem quando eu crio uma postagem, eu tenho minha imagem, etc. Mas quando eu quero modificá-la, eu tenho um problema com o campo “imagem” que é um arquivo carregado, a Symfony quer um tipo de arquivo e tenha uma string (o caminho do arquivo carregado):

The form's view data is expected to be an instance of class Symfony\Component\HttpFoundation\File\File, but is a(n) string. You can avoid this error by setting the "data_class" option to null or by adding a view transformer that transforms a(n) string to an instance of Symfony\Component\HttpFoundation\File\File. 

Estou realmente preso a este problema e realmente não sei como resolvê-lo, qualquer ajuda será muito apreciada! Muito obrigado!

Aqui está o meu PostType.php (que é usado em newAction () e modifiyAction ()) e que pode causar o problema ( Form / PostType.php ):

 add('title') ->add('picture', 'file');//there is a problem here when I call the modifyAction() that calls the PostType file. } public function getDefaultOptions(array $options) { return array( 'data_class' => 'MyBundle\Entity\Post', ); } public static function processImage(UploadedFile $uploaded_file, Post $post) { $path = 'pictures/blog/'; //getClientOriginalName() => Returns the original file name. $uploaded_file_info = pathinfo($uploaded_file->getClientOriginalName()); $file_name = "post_" . $post->getTitle() . "." . $uploaded_file_info['extension'] ; $uploaded_file->move($path, $file_name); return $file_name; } public function getName() { return 'form_post'; } } 

Aqui está minha entidade Post ( Entity / Post.php ):

 <?php namespace MyBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Validator\Constraints as Assert; /** * MyBundle\Entity\Post * * @ORM\Table() * @ORM\Entity */ class Post { /** * @var integer $id * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @ORM\Column(type="string", length=255, nullable=true) * @Assert\Image( * mimeTypesMessage = "Not valid.", * maxSize = "5M", * maxSizeMessage = "Too big." * ) */ private $picture; /** * @var string $title * * @ORM\Column(name="title", type="string", length=255) */ private $title; //getters and setters } 

Aqui está o meu newAction () ( Controller / PostController.php ). Tudo funciona bem com esta function :

 public function newAction() { $em = $this->getDoctrine()->getEntityManager(); $post = new Post(); $form = $this->createForm(new PostType, $post); $post->setPicture(""); $form->setData($post); if ($this->getRequest()->getMethod() == 'POST') { $form->bindRequest($this->getRequest(), $post); if ($form->isValid()) { $uploaded_file = $form['picture']->getData(); if ($uploaded_file) { $picture = PostType::processImage($uploaded_file, $post); $post->setPicture('pictures/blog/' . $picture); } $em->persist($post); $em->flush(); $this->get('session')->setFlash('succes', 'Post added.'); return $this->redirect($this->generateUrl('MyBundle_post_show', array('id' => $post->getId()))); } } return $this->render('MyBundle:Post:new.html.twig', array('form' => $form->createView())); } 

Aqui está o meu modifyAction () ( Controller / PostController.php ): há um problema com esta function

 public function modifyAction($id) { $em = $this->getDoctrine()->getEntityManager(); $post = $em->getRepository('MyBundle:Post')->find($id); $form = $this->createForm(new PostType, $post);//THIS LINE CAUSES THE EXCEPTION if ($this->getRequest()->getMethod() == 'POST') { $form->bindRequest($this->getRequest(), $post); if ($form->isValid()) { $uploaded_file = $form['picture']->getData(); if ($uploaded_file) { $picture = PostType::processImage($uploaded_file, $post); $post->setPicture('pictures/blog/' . $picture); } $em->persist($post); $em->flush(); $this->get('session')->setFlash('succes', 'Modifications saved.'); return $this->redirect($this->generateUrl('MyBundle_post_show', array('id' => $post->getId()))); } } return $this->render('MyBundle:Post:modify.html.twig', array('form' => $form->createView(), 'post' => $post)); } 

data_class a configuração do problema data_class para null seguinte maneira:

 public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('title') ->add('picture', 'file', array('data_class' => null) ); } 

Eu recomendaria que você leia a documentação do upload de arquivos com o Symfony e a Doctrine. Como lidar com arquivos uploads com a Doctrine e uma recomendação forte para a parte Lifecycle callbacks

Em um resumo, você geralmente usa a variável ‘arquivo’ (veja a documentação), você pode colocar um label diferente através das opções e, em seu campo ‘imagem’, você apenas armazena o nome do arquivo, porque quando você precisa o arquivo src, você pode simplesmente chamar o método getWebpath ().

 ->add('file', 'file', array('label' => 'Post Picture' ) ); 

para chamar seu modelo de twig

  

Faça abaixo a alteração no seu PostType.php .

 public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('title') ->add('picture', 'file', array( 'data_class' => 'Symfony\Component\HttpFoundation\File\File', 'property_path' => 'picture' ) ); }