Jms Serializer динамическая экспозиция

Я использую Symfony 3, Doctrine 2, FOS Rest bundle и JMS Serializer.
Я использую политику исключить все в моем приложении, а затем выборочно выставляю поля.

В User Entity я хочу иметь возможность выставлять дополнительные поля только для текущего пользователя.

Например на нормальном api/user/{id} конечную точку, я хочу выставить нормальные данные, но потом для api/user/current Я хочу выставить немного больше данных.

Например.

/**
* ...
* @Serializer\ExclusionPolicy("all")
*/
class Users implements UserInterface
{
/**
* @var string
* @Serializer\Expose
*
* @ORM\Column(name="name", type="string", length=255, nullable=true)
*/
private $name;/**
* @var string
*
* @ORM\Column(name="secretfield", type="string", length=255, nullable=true)
*/
private $secretfield;

Я попробовал @groups decorator, но это работает только для дальнейшего сокращения полей и потребует от меня изменения нагрузки и осторожности, чтобы везде установить контекст группы «по умолчанию».

Я видел Стратегия динамического исключения, упоминается в документы, но я не могу понять, если это то, что мне нужно или нет, и какие переменные доступны для построения выражения из.

Любые идеи, что лучший способ сделать это будет?

0

Решение

Моим главным беспокойством было поведение «отправить все по умолчанию», которое возникло бы при установке политики исключения на none.

Но я немного больше изучил группы и обнаружил, что могу установить группу по умолчанию в конфигурации.

fos_rest:
serializer:
groups: ["default"]

Я проверил это на своем контроллере пользователя и без указания каких-либо групп на объекте или в контексте сериализатора ничего не вернул.
Поэтому я изменил свою сущность, чтобы использовать @Serializer\Groups({"default"}) вместо @Serializer\Expose, Что вернуло меня к тем же возвращенным данным, что и когда я начал.

Затем я добавил current_user сгруппировать в секретные поля моей сущности и добавить группу в контекст сериализатора, чтобы получить эти дополнительные поля для этого конкретного представления.

В сущности:

/**
* ...
* @Serializer\ExclusionPolicy("none")
*/
class Users implements UserInterface
{
/**
* @var string
* @Serializer\Groups({"default"})
*
* @ORM\Column(name="name", type="string", length=255, nullable=true)
*/
private $name;/**
* @var string
* @Serializer\Groups({"current_user"})
*
* @ORM\Column(name="secretfield", type="string", length=255, nullable=true)
*/
private $secretfield;

И в контроллере:

/**
* @Rest\Get("user/current")
*
* @return \FOS\RestBundle\View\View
*/
public function getCurrentAction()
{
$me = $this->getUser();

$view = new View($me, Response::HTTP_OK);
/** @var Context $context */
$context = $view->getContext();
$context->setGroups(['current_user', 'default']);
$view->setContext($context);

return $view;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]