Symfony2 REST API - 部分更新

问题描述:

我正在用Symfony2中的FOSRestBundle构建一个REST API。我正在使用表单来创建和更新Doctrine2的实体。一切工作正常,如果我发送所有表单域。例如:Symfony2 REST API - 部分更新

{"first_name":"Pi","last_name":"Wi"} 

该人插入正常,但现在我只想更新姓氏。

{"last_name":"Wi"} 

问题是更新后名称为空,因为表单使用“null”值更新实体(因为未给出)。是否可以更新姓氏并忽略名字?

当然,这是可能的。

首先,就RESTful而言,这将是一个PATCH请求,所以如果您使用的是the ClassResourceInterface based controller approach,则必须在控制器中添加一个patchAction方法。

然后,处理提交的表单时,你需要一个false$clearMissing选项传递到您的表单提交方法调用在控制器中,像这样:

<?php 
// in your controller's patchAction: 

/** @var \Symfony\Component\Form\FormInterface $form */ 
/** @var \Symfony\Component\HttpFoundation\Request $request */ 

$form->submit($request, false); 

这将告诉表单组件只更新从表单传递的字段,而不清除缺少的字段(如参数的名称所示)。请参阅source code以供参考。

请注意,从Symfony 3.0开始,将Request传递给FormInterface::submit()方法将不推荐使用,因此此答案适用于Symfony 2.x。

+0

from the docs:“submit()'方法已被弃用,并将在Symfony 3.0中删除” – NDM 2014-09-03 07:56:07

+0

@NDM,你能给出一个确切的链接吗?我在submit()方法中唯一发现的是 >>将请求直接传递给submit()仍然有效,但不推荐使用,将在Symfony 3.0中删除。 请参阅http://symfony.com/doc/current/cookbook/form/direct_submit.html#passing-a-request-to-form-submit-deprecated – kix 2014-09-03 08:07:31

+1

谢谢!但是,它已被弃用;-)然而,你给了我正确的关键字做一个新的谷歌搜索,我发现这在StackOverflow:http://stackoverflow.com/questions/19793767/does-symfony-2-support-partial - 形式的结合。您可以使用handleRequest并确保请求方法是“PATCH”。由于大多数浏览器不发送PATCH请求,因此可以使用_method来覆盖该方法。然后它开箱即用! :-)我接受你的答案,因为这是两个最好的答案。 – 2014-09-03 08:10:12