2014-02-25 45 views
2

我读过这篇文章(http://welcometothebundle.com/symfony2-rest-api-the-best-2013-way/),用Symfony2构建我的系统REST API。遵循指南,我不再使用Symfony2 Form作为Web表单,但只有2个主要工作:将数据映射到实体验证。在我看来,我使用AngularJS在其良好的内置服务的帮助下调用REST API。Symfony2 Form + AngularJS for REST API =表单验证额外字段错误

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

{ 
    email: "[email protected]" 
    id: 22 
    party: { 
     id:24, 
     lastName: Gates, 
     firstName: Bill 
    } 
} 

使一些变化,然后送$ scope.object更新与PUT方法的路线,我将使用Symfony2的表单并提交该数据,但Symfony2的表单验证保持引发异常这种形式不应含有多余的领域。。我知道ID字段不是表单字段,但不知道如何使Symfony忽略所有这些额外的字段。你可以帮我吗?

+0

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

回答

4

如果id字段不是表单字段,那么你可以添加到您的形式,而是将其添加为一个非映射字段(即它不涉及到对实体属性):

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

我正在寻找一些东西来忽略在这里提到的额外的https://github.com/symfony/symfony/issues/7209。但是,也许你们是目前解决这个问题的唯一方法。非常感谢你! –

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的不尝试将其映射到你的实体。像@JamesHallall已经提到。

2

从Symfony的版本2.6你可以用新的形式选项allow_extra_fieldsaccepted pull request)。 2.6松开2014分之11is planned但你已经可以使用它(在composer.json):在Symfony的形式给出

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

这是个好消息,upvoting。在不久的将来,这将是最好的答案。 –

+0

使用开发版本从来不会令人鼓舞,但是,现在应该可以在2.7中使用。 – tomazahlin