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

时间:2014-02-25 08:15:09

标签: php angularjs rest symfony

我已经阅读了这篇文章(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忽略所有这些额外的字段。你能救我吗?

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

有两种解决方案:

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

    $data = $request->request->all(); // get all posted data
    unset($data['id']);
    $data['party'] = $data['party']['id'];
    
    $form->submit($data);
    
  2. 您可以将字段添加到表单类型或表单构建器,并将mapped - 选项设置为false,以便Symfony不会尝试将其映射到您的实体。就像@JamesHalsall已经提到的那样。