我已经阅读了这篇文章(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忽略所有这些额外的字段。你能救我吗?
答案 0 :(得分:4)
如果id
字段不是表单字段,那么您可以将其添加到表单中,但将其添加为非映射字段(即它与实体上的属性无关):< / p>
$builder->add('id', 'hidden', array('mapped' => false));
答案 1 :(得分:2)
从Symfony版本2.6
,您可以使用新表单选项allow_extra_fields
(accepted pull request)。 2.6
在2014年11月发布了is planned,但您已经可以使用它(在composer.json
中):
"symfony/symfony": "2.6.*@dev"
答案 2 :(得分:1)
有两种解决方案:
您可以取消设置字段id
并在将数据数组传递给表单之前修改请求数据,以使其适合您的表单。在你的情况下,我认为它必须是:
$data = $request->request->all(); // get all posted data
unset($data['id']);
$data['party'] = $data['party']['id'];
$form->submit($data);
您可以将字段添加到表单类型或表单构建器,并将mapped
- 选项设置为false
,以便Symfony不会尝试将其映射到您的实体。就像@JamesHalsall已经提到的那样。