如何将 POST body 内容反序列化为带有 @ExclusionPolicy("all") 集的实体
how to deserialize a POST body content into an Entity with @ExclusionPolicy("all") set
我正在使用 JMSSerializerBundle
和 FOSRestBundle
,我正在尝试通过 @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")
,部分属性为 @expose
d。当我连载时那是完美的;不幸的是,在将我的 body 反序列化为 User
object 时,未设置未公开的属性。有没有一种干净的方法来处理这个问题?
回答我自己:@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)
{
这样,只有密码会被反序列化。
我正在使用 JMSSerializerBundle
和 FOSRestBundle
,我正在尝试通过 @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")
,部分属性为 @expose
d。当我连载时那是完美的;不幸的是,在将我的 body 反序列化为 User
object 时,未设置未公开的属性。有没有一种干净的方法来处理这个问题?
回答我自己:@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)
{
这样,只有密码会被反序列化。