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() 不显示字段?