Symfony2 实现 PATCH 方法来更新用户字段

Posted

技术标签:

【中文标题】Symfony2 实现 PATCH 方法来更新用户字段【英文标题】:Symfony2 implement PATCH method to update user fileds 【发布时间】:2016-12-16 23:27:00 【问题描述】:

如何使用PATCH 方法更新 FOS USER 用户详细信息。所以当我在 Json 中传递部分细节时,只会更新这些细节。

用户实体

  /**
   * @ORM\Entity
   * @ORM\Table(name="user")
   */
  abstract class User extends BaseUser
  
      /**
       * @var int
       *
       * @ORM\Column(name="id", type="integer")
       * @ORM\Id
       * @ORM\GeneratedValue(strategy="AUTO")
       */
      protected $id;

      /**
       * @var string]
       * @ORM\Column(name="first_name", type="string", length=255, nullable=true)
       */
      private $firstName;

      /**
       * @var string
       * @ORM\Column(name="last_name", type="string", length=255, nullable=true)
       */
      private $lastName;

     // getters and setters are here
      

例如。我有用户 Jack Nickolson,我的 json 是:

  "firstName": "John"

只更新名字。

这是我的控制器。如何在不指定参数的情况下为用户设置新参数?

     /**
      * @Route("/update", name="api_user_update")
      * @Security("has_role('ROLE_USER')")
      * @Method("PATCH")
      */
     public function updateAction(Request $request)
         $jsonContent = $request->getContent();
         $params = json_decode($jsonContent);
         $em = $this->getDoctrine()->getEntityManager();
         $response = new JsonResponse();

         $user = $this->getUser();

         // do something to update user details

         $this->get('fos_user.user_manager')->updateUser($user);

         $em->persist($user);
         $em->flush();

         $response->setContent([
        "status" => "user ". $user->getUsername() ." is updated"
         ]);

         return $response;
     

更新

我尝试使用下面的答案,所以这就是我现在所拥有的

    public function updateAction(Request $request)
    $em = $this->getDoctrine()->getEntityManager();
    $response = new JsonResponse();

    $user = $this->getUser();
    $editForm = $this->createForm('CoreBundle\Form\UserType', $user);

    $requestData = $request->getContent();
    $requestData = json_encode($requestData, true);

    $editForm->submit($requestData, false);

    $this->get('fos_user.user_manager')->updateUser($user);

    $em->persist($user);
    $em->flush();

    $response->setContent([
    "status" => "user ". $user->getUsername() ." is updated"
     ]);

    return $response;

嗯,我的实体没有更新。我做错了什么?

【问题讨论】:

【参考方案1】:

您需要准备并创建UserType 表单以进行部分更新。

然后,在处理提交的表单时,您需要将错误的$clearMissing 选项传递给控制器​​中表单的提交方法调用:

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

由于该选项,表单组件将仅更新从请求传递的字段。

然后刷新用户:

$em->flush();

如果你想发送如下数据:

"firstName": "John"

你的 UserType 表单应该有方法:

public function getBlockPrefix()

    return "";

你也可以使用漂亮而强大的https://github.com/FriendsOfSymfony/FOSRestBundle

【讨论】:

谢谢,但我没有使用表单来创建或更新用户。我正在创建 REST 应用程序。我还需要 UserType 吗? 您不必这样做,但根据我在创建 REST API 时的经验,使用Symfony2 表单组件要方便得多。 请查看这篇文章的例子:welcometothebundle.com/… 嘿,我试着按照你的建议去做。创建 UserType 并将 json 数据提交到表单。但它没有用 请给我看您的UserType 表格。你之前用过Symfony2 表单组件吗?您还需要检查表单是否有效

以上是关于Symfony2 实现 PATCH 方法来更新用户字段的主要内容,如果未能解决你的问题,请参考以下文章

PATCH 方法是不是应该在响应正文中返回资源的所有字段?

Symfony2:如何实现自定义用户登录和注册——摆脱 FOSUSerBundle

Symfony2、Sonata、UserBundle:当用户启用更新时发送电子邮件

Patch Manager Plus已支持驱动程序和BIOS更新

带有表单日期 c# 的 PATCH 请求

symfony2 选民或 acl