Symfony2 Form + AngularJS for REST API = 表单验证额外字段错误

Posted

技术标签:

【中文标题】Symfony2 Form + AngularJS for REST API = 表单验证额外字段错误【英文标题】:Symfony2 Form + AngularJS for REST API = Form validation extra fields error 【发布时间】:2014-03-27 07:46:51 【问题描述】:

我已阅读这篇文章 (http://welcometothebundle.com/symfony2-rest-api-the-best-2013-way/) 以使用 Symfony2 构建我的系统 REST API。按照指南,我不再使用 Symfony2 表单作为 web 表单,而只使用 2 个主要工作:将数据映射到实体验证。在我看来,我正在使用 AngularJS 在其良好的内置服务的帮助下调用 REST API。

在我的情况下,我想更新我的实体,AngularJS 将获取从实体序列化的 JSON 数据并设置回 $scope.object 以绑定到表单。例如:


    email: "bill.gates@testsite.com"
    id: 22
    party: 
        id:24,
        lastName: Gates,
        firstName: Bill
    

进行一些更改,然后发送 $scope.object 以使用 PUT 方法更新路由,我将使用 Symfony2 表单并提交此数据,但 Symfony2 表单验证不断抛出异常 此表单不应包含额外字段。。我知道 id 字段不是表单字段,但不知道如何让 Symfony 忽略所有这些额外的字段。你能帮帮我吗?

【问题讨论】:

Symfony 表单中给出的表单参数名称与 JSON 的字段名称不匹配。 Symfony 表单通常有 myform[email] myform[id]。因此,表单处理程序不会捕获正确的字段名称,而是将它们放到额外的字段中。顺便说一句,我正在一个在 AngularJS + Symfony2 之上开发的组织中工作。在我们的应用程序中,当我们想要 POST /some_url 时,我们使用 JMSSerializerBundle 提供的 JSON 反序列化。你可以看看那个:) 【参考方案1】:

如果id 字段不是表单字段,那么您可以将其添加到表单中,但将其添加为非映射字段(即它与实体上的属性无关):

$builder->add('id', 'hidden', array('mapped' => false));

【讨论】:

我正在寻找可以忽略此处提到的额外表单的内容github.com/symfony/symfony/issues/7209。但也许你的方法是目前解决这个问题的唯一方法。非常感谢!【参考方案2】:

有两种解决方案:

    在将数据数组传递给表单之前,您可以取消设置字段id 并修改请求数据,使其适合您的表单。在你的情况下,我认为它必须是:

    $data = $request->request->all(); // get all posted data
    unset($data['id']);
    $data['party'] = $data['party']['id'];
    
    $form->submit($data);
    

    您可以将该字段添加到您的表单类型或表单构建器,并将mapped-选项设置为false,这样Symfony 就不会尝试将其映射到您的实体。就像@JamesHalsall 已经提到的那样。

【讨论】:

【参考方案3】:

从 Symfony 版本 2.6 开始,您可以使用新的表单选项 allow_extra_fields (accepted pull request)。 2.6 于 2014 年 11 月发布 is planned,但您已经可以使用它了(在 composer.json 中):

"symfony/symfony": "2.6.*@dev"

【讨论】:

这是个好消息,点赞。在不久的将来,这将是最好的答案。 使用开发版本从不令人鼓舞,但是是的,现在 2.7 中应该可以使用。

以上是关于Symfony2 Form + AngularJS for REST API = 表单验证额外字段错误的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 - 在树枝中自定义 form_start 函数

如何使用 Symfony2 使 form_rest() 不显示字段?

Symfony2 - 如何阻止 Form->handleRequest 清空帖子数据中不存在的字段

翻译 Symfony2 类表单中的选择选项

Symfony2无效形式没有错误

Symfony2 - 动态生成的表单在编辑表单时不起作用