Forms Symfony2中的实体表单类型
我试图创建一个RESTFUL api,当我处理Forms Symfony2中的实体表单类型,forms,rest,symfony,fosrestbundle,Forms,Rest,Symfony,Fosrestbundle,我试图创建一个RESTFUL api,当我处理PUT时,它总是以 { "code": 500, "message": "The form's view data is expected to be an instance of class My\\Bundle\\Entity\\Post, but is a(n) array. You can avoid this error by setting the \"data_class\" option to null or by
PUT
时,它总是以
{
"code": 500,
"message": "The form's view data is expected to be an instance of class My\\Bundle\\Entity\\Post, but is a(n) array. You can avoid this error by setting the \"data_class\" option to null or by adding a view transformer that transforms a(n) array to an instance of My\\Bundle\\Entity\\Post."
}
下面是我如何编写PUT
操作的
public function putPostAction($postKey, Request $request){
$post = $this->getDoctrine()->getManager()->getRepository('MyBundle:Post')
->findPost($postKey);
$form = $form = $this->createFormBuilder($post,
array('data_class' => 'My\Bundle\Entity\Post'))->getForm();
// or use createForm like
// $form = $this->createForm(new PostType(), $post);
$form->submit($request);
if($form->isValid()){
$em = $this->getDoctrine()->getManager();
$em->persist($post);
$em->flush();
return $post;
}
return array(
"form" => $form
);
}
说到实体类型,它看起来像
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('cityKey')
->add('status')
->add('text')
->add('imageKey')
->add('createTime')
->add('updateTime')
;
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'My\Bundle\Entity\Post',
'csrf_protection' => false
));
}
/**
* @return string
*/
public function getName()
{
return '';
}
关于错误消息,我将解析器修改为
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => null,
'csrf_protection' => false
));
}
这次我又犯了一个错误
{
"code": 500,
"message": "EntityManager#persist() expects parameter 1 to be an entity object, array given."
}
有什么想法吗?提前感谢。
findPost
函数返回的是一个对象数组,而不是对象。您应该调用find($id)
,它只返回一个Post
对象
因此,它应该是:
$post = $this->getDoctrine()->getManager()
->getRepository('MyBundle:Post')
->find($postKey);
“findPost”函数返回的是一个对象数组,而不是一个对象。您应该调用“find($id)”,它只返回一个“post”对象。@TurdalievNursultan是的,它可以工作!我之所以编写findPost($postKey)
是因为选择条件包括postKey
和enabled
,因为它需要数据转换器将数组转换为实体,或者通过find($postKey)
首先获取实体,然后使用$post->getEnabled()
确定下一步。节省我大量的时间!谢谢,伙计。把评论移到一个答案,这样人们就知道这个问题已经被回答和接受了。通常很难知道问题是否已经解决。并不是每个人都读这些评论。