Symfony 4 API Rest PUT:将数据映射到数据库实体
Symfony 4 API Rest PUT : Map data to database entity
我是 Symfony 4 的初学者,我正在开发 API Rest。我想创建一个可以处理许多更新案例的 PUT 资源。
在我的例子中,我有一个拥有许多属性的用户,但为了简单起见,我将举一个包含 3 个属性的示例:
User {
username,
email,
password
}
可以调用我的 PUT 资源以更新用户名、更新电子邮件或更新密码。例如,要更新用户名,我的 API 的用户将发送一个只有用户名的 PUT 请求:
{
username: "New username"
}
邮箱和密码也一样,他只会发送他想更改的属性。
我的问题出在我的控制器上,我必须这样做:
/**
* @Rest\Put("/user/{id}")
* @param Request $request
* @return View
*/
public function putUserRequest(Request $request)
{
$userId = $request->get('id');
$user = $this->doctrine->getRepository(User::class)->findOneBy('id' => $userId);
$userFromRequest = $this->serializer->deserialize($request->getContent(), User::class, 'json');
if ($userFromRequest->getUsername() != NULL) {
$user->setUsername($userFromRequest->getUsername())
}
if ($userFromRequest->getEmail() != NULL) {
$user->setEmail($userFromRequest->getEmail())
}
if ($userFromRequest->getPassword() != NULL) {
$user->setPassword($userFromRequest->getPassword())
}
// ...
}
在我的示例中,我只有 3 个属性,但想象一下当我有 30 个属性时。
在 Symfony 3 中,我使用表单来验证/保存我的数据:
$form->submit($request->request->all(), $clearMissing);
其中 $clearMissing 为 false 以保留我的 API 用户未提供的数据。我找不到用序列化器来做的方法,但我想我做错了。
谢谢。
如果我没理解错的话,您可以像这样使用验证器组件:
/**
* @Rest\Put("/user/{id}")
* @param Request $request
* @return View
*/
public function putUserRequest(User $user, Request $request, ValidatorInterface $validator)
{
$data = $request->getContent();
$this->serializer->deserialize($data, User::class, 'json', ['object_to_populate' => $user]);
//At this moment, the data you sent is merged with your user entity
/** @var ConstraintViolationList $errors */
$errors = $validator->validate($user, null ,['groups' => 'user_update']);
if (count($errors) > 0) {
//return json reponse with formated errors;
}
//if ok $entityManager->flush() and Response Json with serialization group;
...
}
在您的用户 class 中:
class User implements UserInterface
{
/**
* @Assert\Email(groups={"user_create", "user_update"})
*/
private $email;
/**
* @Assert\NotBlank(groups={"user_create", "user_update"})
* @Assert\Length(min=7, groups={"user_create", "user_update"})
*/
private $password;
/**
* @Assert\Length(min=2, groups={"user_create", "user_update"} )
*/
private $username;
}
相关验证器组件文档:https://symfony.com/doc/current/validation/groups.html
您也可以查看这个项目:https://github.com/attineos/relation-deserializer
我是 Symfony 4 的初学者,我正在开发 API Rest。我想创建一个可以处理许多更新案例的 PUT 资源。
在我的例子中,我有一个拥有许多属性的用户,但为了简单起见,我将举一个包含 3 个属性的示例:
User {
username,
email,
password
}
可以调用我的 PUT 资源以更新用户名、更新电子邮件或更新密码。例如,要更新用户名,我的 API 的用户将发送一个只有用户名的 PUT 请求:
{
username: "New username"
}
邮箱和密码也一样,他只会发送他想更改的属性。
我的问题出在我的控制器上,我必须这样做:
/**
* @Rest\Put("/user/{id}")
* @param Request $request
* @return View
*/
public function putUserRequest(Request $request)
{
$userId = $request->get('id');
$user = $this->doctrine->getRepository(User::class)->findOneBy('id' => $userId);
$userFromRequest = $this->serializer->deserialize($request->getContent(), User::class, 'json');
if ($userFromRequest->getUsername() != NULL) {
$user->setUsername($userFromRequest->getUsername())
}
if ($userFromRequest->getEmail() != NULL) {
$user->setEmail($userFromRequest->getEmail())
}
if ($userFromRequest->getPassword() != NULL) {
$user->setPassword($userFromRequest->getPassword())
}
// ...
}
在我的示例中,我只有 3 个属性,但想象一下当我有 30 个属性时。
在 Symfony 3 中,我使用表单来验证/保存我的数据:
$form->submit($request->request->all(), $clearMissing);
其中 $clearMissing 为 false 以保留我的 API 用户未提供的数据。我找不到用序列化器来做的方法,但我想我做错了。
谢谢。
如果我没理解错的话,您可以像这样使用验证器组件:
/**
* @Rest\Put("/user/{id}")
* @param Request $request
* @return View
*/
public function putUserRequest(User $user, Request $request, ValidatorInterface $validator)
{
$data = $request->getContent();
$this->serializer->deserialize($data, User::class, 'json', ['object_to_populate' => $user]);
//At this moment, the data you sent is merged with your user entity
/** @var ConstraintViolationList $errors */
$errors = $validator->validate($user, null ,['groups' => 'user_update']);
if (count($errors) > 0) {
//return json reponse with formated errors;
}
//if ok $entityManager->flush() and Response Json with serialization group;
...
}
在您的用户 class 中:
class User implements UserInterface
{
/**
* @Assert\Email(groups={"user_create", "user_update"})
*/
private $email;
/**
* @Assert\NotBlank(groups={"user_create", "user_update"})
* @Assert\Length(min=7, groups={"user_create", "user_update"})
*/
private $password;
/**
* @Assert\Length(min=2, groups={"user_create", "user_update"} )
*/
private $username;
}
相关验证器组件文档:https://symfony.com/doc/current/validation/groups.html
您也可以查看这个项目:https://github.com/attineos/relation-deserializer