我正在使用Symfony2。 我有一个实体发布,它有一个标题和一个图片字段。
我的问题:当我创建帖子时,一切都很好,我有我的图片等。但是当我想修改它时,我的“图片”字段有问题,这是一个上传的文件,Symfony想要一个文件类型,它有一个字符串(上传文件的路径):
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.
我真的遇到了这个问题,真的不知道如何解决它,任何帮助都将不胜感激!非常感谢!
这是我的 PostType.php (在newAction()和modifiyAction()中使用)并且可能导致问题( Form / PostType.php ):
<?php
namespace MyBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use MyBundle\Entity\Post;
class PostType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->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';
}
}
这是我的发布实体( 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
}
这是我的 newAction()( Controller / PostController.php ) 每个都能正常使用此功能 :
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()));
}
这是我的 modifyAction()( Controller / PostController.php ): 此功能存在问题
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));
}
答案 0 :(得分:44)
我解决了将data_class
设置为null
的问题,如下所示:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title')
->add('picture', 'file', array('data_class' => null)
);
}
答案 1 :(得分:3)
我建议您阅读使用Symfony和Doctrine How to handle File Uploads with Doctrine的文件上传文档,并向部分Lifecycle callbacks强烈推荐
在一个简介中,您通常在表单中使用'file'变量(参见文档),您可以在选项中添加不同的标签,然后在“图片”字段中,您只需存储文件的名称,因为当你需要src文件时,你可以调用getWebpath()方法。
->add('file', 'file', array('label' => 'Post Picture' )
);
调用你的树枝模板
<img src="{{ asset(entity.webPath) }}" />
答案 2 :(得分:1)
请在 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'
)
);
}