我正在使用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
没有绑定值的任何建议?
答案 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发送 - 然后它应该工作
我希望这会有所帮助