Я использую Symfony2 и JMSSerializerBundle для создания API. Система, которую JMSSerializer предоставляет для установки различных способов сериализации объектов с использованием групп, весьма полезна, однако мне не хватает способа указать, какую группу вы хотите сериализовать в каждом параметре. Пример:
У меня есть статья, связанная с пользователем (автором). Статьи, а также пользователи могут быть сериализованы как "список" или "подробности", однако я хочу, чтобы пользователи были последовательно сериализованы как "список", так что они извлекаются из статьи (поскольку группа "подробности" зарезервирована для использования для извлечения пользователя и только пользователя). Проблема в том, что если я установил сериализатор как "детали", тогда автор также сериализуется как "детали".
На мой взгляд, код должен выглядеть примерно так:
/**
* @var SCA\APIBundle\Entity\User
* @Groups({"list" => "list", "details" => "list"})
*/
private $author;
где ключ массива указывает способ сериализации родительского элемента, а значение указывает способ, которым должен быть сериализован.
Любой ключ, как я могу это достичь?
Это не должно делаться на скомпонованном объекте, а на композиции.
В вашем случае, я полагаю, у вас есть что-то вроде этого:
class Article
{
/**
* @var User
* @Groups({"list", "details"})
*/
private $author;
}
class User
{
private $firstName;
private $lastName;
}
Итак, если вы хотите выставить свойство firstName при сериализации скомпонованного объекта, вам нужно определить ту же группу в объекте User.
Это будет:
class Article
{
/**
* @var User
* @Groups({"list", "details"})
*/
private $author;
}
class User
{
/*
* @Groups({"list"})
*/
private $firstName;
private $lastName;
}
Если вам нужно больше контроля, вы можете определить более явные группы, такие как "список статей", "имя пользователя", "минимальный список пользователей" и т.д.
Это зависит от вас, чтобы выбрать лучшую стратегию для принятия.