Forms Symfony2中的实体表单类型

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

我试图创建一个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 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()
确定下一步。节省我大量的时间!谢谢,伙计。把评论移到一个答案,这样人们就知道这个问题已经被回答和接受了。通常很难知道问题是否已经解决。并不是每个人都读这些评论。