1

我正在使用JMSSerializerBundle并且FOSRestBundle我正在尝试通过@ParamConverter注释反序列化我的正文请求:

/**
 * @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。当我序列化时,那是完美的;不幸的是,在将我的身体反序列化为User对象时,未设置未暴露的属性。有没有一种干净的方法来处理这个?

4

1 回答 1

0

回答自己:@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)
{

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

于 2016-05-08T03:38:03.647 回答