2014-09-03 65 views
1

我正在用Symfony2中的FOSRestBundle構建一個REST API。我正在使用表單來創建和更新Doctrine2的實體。一切工作正常,如果我發送所有表單域。例如:Symfony2 REST API - 部分更新

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

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

{"last_name":"Wi"} 

問題是更新後名稱爲空,因爲表單使用「null」值更新實體(因爲未給出)。是否可以更新姓氏並忽略名字?

回答

8

當然,這是可能的。

首先,就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