Я использую 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, но это работает только для дальнейшего сокращения полей и потребует от меня изменения нагрузки и осторожности, чтобы везде установить контекст группы «по умолчанию».
Я видел Стратегия динамического исключения, упоминается в документы, но я не могу понять, если это то, что мне нужно или нет, и какие переменные доступны для построения выражения из.
Любые идеи, что лучший способ сделать это будет?
Моим главным беспокойством было поведение «отправить все по умолчанию», которое возникло бы при установке политики исключения на 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;
}
Других решений пока нет …