Symfony中的表单无效,没有错误

时间:2016-03-18 16:59:26

标签: php forms symfony fosrestbundle

这是我第一次尝试使用Symfony的表单,而且我完全陷入困境。我相信这会很简单。

我设置了一个简单的控制器(使用Symfony 2.7和FOSRestBundle 2.0):

/**
 * @View()
 */
public function postPredictionsAction(Request $request)
{
    $form = $this->createFormBuilder(['id' => '1', 'description' => '2'])
        ->add('id', 'text')
        ->add('description', 'text')
        ->getForm();
    $form->handleRequest($request);

    if ($form->isValid()) {
        return true;
    }

    print_r($request->request->all());
    print_r($form->getData());
    print_r((string) $form->getErrors(true, false));

    return false;
}

但是我的表格总是无效的,即使没有错误:

curl -X POST --data 'id=foo&description=bar' http://localhost:8080/bracket/predictions
Array
(
    [id] => foo
    [description] => bar
)
Array
(
    [id] => 1
    [description] => 2
)
false

所以看起来我的请求数据没有进入表单,并且由于某种原因表单无效,即使根本没有打印错误。

编辑:经过大量的讨论,似乎handleRequest()调用已确定表单尚未提交,因此未经过验证 - 这意味着我将进入上述情况。

因此我可以用handleRequest()代替submit()代替RewriteEngine on RewriteCond %{HTTP:Accept-Language} (en) [NC] RewriteRule .* server.com/press_en.php [L] RewriteCond %{HTTP:Accept-Language} (de) [NC] RewriteRule .* server.com/press_de.php [L] 作为解决方法。这被描述为文档的弃用行为:

http://symfony.com/doc/2.7/cookbook/form/direct_submit.html#cookbook-form-submit-request

所以我显然仍然做错了什么,但我看不出Symfony文档的内容。

2 个答案:

答案 0 :(得分:0)

默认情况下,Symfony会自动为您嵌入并验证CSRF令牌,因此错误可能是因为未提供令牌。

阅读更多:

http://symfony.com/doc/current/book/forms.html#csrf-protection

答案 1 :(得分:0)

我已经确定了问题所在。

在发布像我这样的数据时,默认情况下Symfony希望将其封装在表单的名称中。例如,使用JSON:

{
  "form": {
    "id": "12",
    "name": "abc"
  }
}

现在对于RESTful API并不是我想要的(我也不怀疑大多数人想要或期望的行为),所以你可以在代码中执行以下操作:

/**
 * @View()
 */
public function postPredictionsAction(Request $request)
{
    $form = $this->createFormBuilder(['id' => '1', 'description' => '2'])
        ->add('id', 'text')
        ->add('description', 'text')
        ->getForm();

    // NOTE: we use submit here, but pass the data as an array, thus
    // making it Symfony 3 compatible
    $form->submit($request->request->all());

    if ($form->isValid()) {
        // Do valid work
    }

    // Output validation errors
    return $form;
}

使用以下JSON可以正常工作:

{
  "id": "12",
  "name": "abc"
}

希望能帮助别人避开兔子洞,我发现这很困难!