我正在使用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")
,某些属性为@expose
d。当我序列化时,这是完美的;不幸的是,当我将我的身体反序列化为一个User
物体时,没有设置未暴露的属性。有没有一个干净的方法来处理这个?
答案 0 :(得分:0)
回答自己:@ExclusionPolicy(“all”)
不是出于安全目的而想要的。该标记用于处理不应序列化的数据,无论是否出于安全原因有时不应出现。这是一个静态的东西,就像那样。
我真正想要的是使用groups
管理要显示与否的内容(或考虑反序列化)。因此:
一个例子:
*实体*
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)
{
这样,只有密码才会被反序列化。