【问题标题】:Symfony2 REST API - Partial updateSymfony2 REST API - 部分更新
【发布时间】:2014-10-27 15:05:54
【问题描述】:

我正在 Symfony2 中使用 FOSRestBundle 构建 REST API。我正在使用表单通过 Doctrine2 创建和更新实体。如果我发送所有表单字段,一切正常。示例:

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

此人已正确插入,但现在我只想更新姓氏。

{"last_name":"Wi"}

问题是更新后名字是空的,因为表单用“null”值更新了实体(因为它没有给出)。是否可以只更新姓氏而忽略名字?

【问题讨论】:

    标签: php rest symfony fosrestbundle


    【解决方案1】:

    当然,这是可能的。

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

    但请注意,将 Request 传递给 FormInterface::submit() 方法将在 Symfony 3.0 中被弃用,因此此答案适用于 Symfony 2.x。

    【讨论】:

    • 来自文档:“submit() 方法已被弃用,将在 Symfony 3.0 中删除”
    • @NDM,你能给出一个确切的链接吗?我在submit() 上发现的唯一一件事是 >> 直接将请求传递给 submit() 仍然有效,但已被弃用,并将在 Symfony 3.0 中删除。见symfony.com/doc/current/cookbook/form/…
    • 谢谢!但是,它已被弃用;-) 但是,您给了我正确的关键字来进行新的 Google 搜索,我在 StackOverflow 上找到了这个:stackoverflow.com/questions/19793767/…。您可以使用handleRequest 并确保请求方法是PATCH。因为大多数浏览器不发送 PATCH 请求,您可以使用 _method 覆盖该方法。然后它开箱即用! :-) 我接受你的回答,因为这是给出的两个中最好的。
    • 当你的表单无效(它没有处理请求)是因为 Symfony 表单没有处理 PATCH 方法(只有 GET 和 POST)。一种解决方法是将method 选项设置为PATCH。阅读本文了解更多信息:sroze.io/2013/10/30/…
    • 在这种情况下不推荐使用,仅当您计划将当前项目移至 Symfony 3 时才相关。我不会为现有项目这样做,只为新项目...
    猜你喜欢
    • 1970-01-01
    • 2019-07-13
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    相关资源
    最近更新 更多