как десериализовать содержимое тела POST в объект с установленным @ExclusionPolicy(all)

Я использую 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, неустановленные атрибуты не устанавливаются. Есть ли чистый способ справиться с этим?


person Bertuz    schedule 07.05.2016    source источник


Ответы (1)


Отвечаю себе: @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)
{

таким образом будет десериализован только пароль.

person Bertuz    schedule 08.05.2016