【问题标题】:Invalid Form in Symfony with no errorsSymfony 中的无效表单,没有错误
【发布时间】:2016-03-18 16:59:26
【问题描述】:

这是我第一次尝试在 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() 调用似乎已确定表单尚未提交,因此未经过验证 - 这意味着我进入了上述情况。

所以我可以用submit() 代替handleRequest() 来代替它作为解决方法。这被文档描述为不推荐使用的行为:

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

所以我显然仍然做错了什么,但我无法从 Symfony 文档中看到它是什么。

【问题讨论】:

    标签: php forms symfony fosrestbundle


    【解决方案1】:

    我已经确定了问题所在。

    当像我一样发布数据时,默认情况下 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"
    }
    

    希望能帮助其他人避开兔子洞,我发现这一点很艰难!

    【讨论】:

      【解决方案2】:

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

      阅读更多:

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

      【讨论】:

      • 谢谢,我应该提到我已经在整个系统范围内禁用了 CSRF - 如果这是问题的话,我还希望看到来自 getErrors() 调用的 CSRF 错误。
      猜你喜欢
      • 2016-04-25
      • 2012-04-12
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多