首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony 4 API Rest PUT :将数据映射到数据库实体

Symfony 4 API Rest PUT :将数据映射到数据库实体
EN

Stack Overflow用户
提问于 2019-07-29 15:06:15
回答 1查看 818关注 0票数 1

我是Symfony 4的乞讨者,我正在开发一个API Rest。我想创建一个可以处理许多更新情况的PUT资源。

在我的例子中,我有一个有很多属性的用户,但为了简单起见,我将举一个有3个属性的例子:

代码语言:javascript
复制
User {
    username,
    email,
    password
}

可以调用我的PUT资源来更新用户名、更新电子邮件或更新密码。例如,要更新Username,我的API的用户将发送一个仅带username的PUT请求:

代码语言:javascript
复制
{
    username: "New username"
}

相同的电子邮件和密码,他将只发送他想要更改的属性。

我的问题出在我的控制器上,我必须这样做:

代码语言:javascript
复制
/**
 * @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中,我使用表单来验证/保存数据:

代码语言:javascript
复制
$form->submit($request->request->all(), $clearMissing);

其中$clearMissing为false,以保留不是由我的接口的用户提供的数据。我找不到一种使用序列化的方法,但我想我做错了。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-29 17:38:32

如果我理解正确的话,您可以像这样使用验证器组件:

代码语言:javascript
复制
/**
 * @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;

    ...

}

在user类中:

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57248682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档