【问题标题】:Symfony 4 API Rest PUT : Map data to database entitySymfony 4 API Rest PUT:将数据映射到数据库实体
【发布时间】:2019-07-29 07:06:15
【问题描述】:

我是 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 用户未提供的数据。我找不到使用序列化程序的方法,但我想我做错了。

谢谢。

【问题讨论】:

    标签: api symfony symfony4 put serialization


    【解决方案1】:

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

    /**
     * @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 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

    【讨论】:

    • 谢谢@Geo 这正是我所需要的!
    猜你喜欢
    • 1970-01-01
    • 2010-10-14
    • 2011-04-19
    • 2014-10-21
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    相关资源
    最近更新 更多