1

我正在使用 FOSRestbundle 实现 rest API。现在说对于 POST 请求,我正在正确获取请求参数,例如:

Symfony\Component\HttpFoundation\ParameterBag Object
(
    [parameters:protected] => Array
        (
            [rank] => 12
            [city] => 1345
            [comment]=> 'safd'
        )

)

我的发布操作代码是:

/**
 * @Rest\View
 */   
public function newAction(){

    $rank= new Rank();       
    $form = $this->createForm(new RankType(), $rank);
    $form->bind($this->getRequest());
    if ($form->isValid()) {
      //.  $user->flush();

      $em = $this->getDoctrine()->getManager();
      $em->persist($rank);
      $em->flush();
      $response = new Response();
      $response->setStatusCode($statusCode);
      $view = View::create()  
        ->setData($rank)
        ->setFormat('json');

      return $this->handleView($view);
    }

    return $this->handleView(View::create($form, 400));
}

form->isValid由于将空值设置为表单而失败。

After Binding form form->getData() will display :


MyProject\DataBundle\Entity\Rank Object
(
    [city:MyProject\DataBundle\Entity\Ranking:private] => 
    [rank:MyProject\DataBundle\Entity\Ranking:private] => 
    [comment:MyProject\DataBundle\Entity\Ranking:private] => 
)   

RankType 代码:

class RankType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('rank');
        $builder->add('city');
        $builder->add('comment');
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'        => 'Myporject\DataBundle\Entity\rank',
            'csrf_protection'   => false,
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'rank';
    }
}

验证会抛出像城市这样的错误,排名不应该为空

有什么建议为什么$form->bind不绑定值?

4

1 回答 1

12

我想,我刚刚在我的应用程序中解决了同样的问题:)

查看您的表单:getName() 方法返回 'rank' - 这是表单的名称,这是此表单数据的命名空间 :) Symfony2 将使用它来绑定。

因此,当您发送这样的数据时:

array('rank'=> 'somevalue', 'city' => 'comecityname', 'comment' => 'somecomment')

它不起作用,因为 bind 方法将搜索放置在“rank”命名空间下的数据数组并找到字符串“somevalue”。表单数据将保持为空。

将数据格式更改为:

array('rank' => array('rank'=> 'somevalue', 'city' => 'comecityname', 'comment' => 'somecomment'))

并与 REST 一起发送 - 然后它应该可以工作

我希望这个能帮上忙

于 2012-11-14T08:57:31.007 回答