表单绑定不绑定请求在Symfony 2.1 + FOSRestBundle中形成

时间:2012-10-31 15:10:46

标签: forms symfony bind symfony-2.1 fosrestbundle

我正在使用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没有绑定值的任何建议?

1 个答案:

答案 0 :(得分:12)

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

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

所以,当你发送这样的数据时:

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

它不起作用,因为bind方法将搜索位于' rank'之下的数据数组。命名空间,将找到字符串&some;“#val;'。表格数据将保持空白。

将数据格式更改为:

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

并使用REST发送 - 然后它应该工作

我希望这会有所帮助