Symfony2 实现 PATCH 方法来更新用户字段
Symfony2 implement PATCH method to update user fileds
如何使用 方法更新 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;
}
好吧,我的实体没有更新。我做错了什么?
您需要准备和创建 UserType
表格以进行部分更新。
然后,在处理提交的表单时,您需要将错误的 $clearMissing
选项传递给控制器中表单的提交方法调用:
$form->submit($request, false);
感谢该选项,表单组件将只更新从请求传递的字段。
然后刷新用户:
$em->flush();
此外,如果您想要发送如下数据:
{"firstName": "John"}
您的 UserType 表单应该有方法:
public function getBlockPrefix()
{
return "";
}
你也可以使用nice and powerfull https://github.com/FriendsOfSymfony/FOSRestBundle
如何使用
用户实体
/**
* @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;
}
好吧,我的实体没有更新。我做错了什么?
您需要准备和创建 UserType
表格以进行部分更新。
然后,在处理提交的表单时,您需要将错误的 $clearMissing
选项传递给控制器中表单的提交方法调用:
$form->submit($request, false);
感谢该选项,表单组件将只更新从请求传递的字段。
然后刷新用户:
$em->flush();
此外,如果您想要发送如下数据:
{"firstName": "John"}
您的 UserType 表单应该有方法:
public function getBlockPrefix()
{
return "";
}
你也可以使用nice and powerfull https://github.com/FriendsOfSymfony/FOSRestBundle