如何将 POST body 内容反序列化为带有 @ExclusionPolicy("all") 集的实体

how to deserialize a POST body content into an Entity with @ExclusionPolicy("all") set

我正在使用 JMSSerializerBundleFOSRestBundle,我正在尝试通过 @ParamConverter 注释反序列化我的 body 请求:

/**
 * @View()
 *
 * @Route("/users/{username}/globaltoken", defaults={"_format" = "json"}, requirements={"user"="\w+"})
 * @ParamConverter(
 *     "userBody", class="Belka\AuthBundle\Entity\User",
 *     converter="fos_rest.request_body"
 * )
 */
public function postAction($username, User $userBody)
{
...

User 实体已设置 @ExclusionPolicy("all"),部分属性为 @exposed。当我连载时那是完美的;不幸的是,在将我的 body 反序列化为 User object 时,未设置未公开的属性。有没有一种干净的方法来处理这个问题?

回答我自己:@ExclusionPolicy(“all”) 出于安全考虑,这不是您想要的。该标签是为处理不应序列化的数据而生的,无论有时出于安全原因不应出现。这是一个静态的东西,这样就可以了。

我真正想要的是通过使用 groups 管理显示或不显示的内容(或考虑反序列化)。因此:

  1. 声明一些组并分配属性
  2. 在控制器中使用所需的组:反序列化和序列化将仅考虑属于至少一个已声明组的属性。

一个例子:

* 实体 *

class User implements EncoderAwareInterface
{
    /**
     * @ORM\Id
     * @ORM\Column(type="string")
     * @Assert\NotBlank(message = "user.username.not_blank")
     * @ORM\GeneratedValue(strategy="NONE")
     * @Serializer\Groups({"default"})
     */
    private $username;

    /**
     * @ORM\Column(type="string", nullable=true)
     * @Serializer\Groups("personal")
     */
    private $password;

    ...

* 控制器 *

/**
 * @ParamConverter(
 *     "userBody",
 *     class="Belka\AuthBundle\Entity\User",
 *     converter="fos_rest.request_body",
 *     options={"deserializationContext"={"groups"={"personal"}}}
 * )
 */
public function postAction($username, User $userBody, $_format)
{

这样,只有密码会被反序列化。