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

ste*_*fun 1 forms bind symfony symfony-2.1 fosrestbundle

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

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

)
Run Code Online (Sandbox Code Playgroud)

我的帖子操作代码是:

/**
 * @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));
}
Run Code Online (Sandbox Code Playgroud)

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] => 
)   
Run Code Online (Sandbox Code Playgroud)

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';
    }
}
Run Code Online (Sandbox Code Playgroud)

验证将像城市一样抛出错误,等级不应为空

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

小智 12

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

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

那么,当你发送这样的数据时:

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

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

将数据格式更改为:

array('rank' => array('rank'=> 'somevalue', 'city' => 'comecityname', 'comment' => 'somecomment'))
Run Code Online (Sandbox Code Playgroud)

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

我希望这个能帮上忙