JMSSerializerBundle: указать группу для каждого атрибута

1

Я использую Symfony2 и JMSSerializerBundle для создания API. Система, которую JMSSerializer предоставляет для установки различных способов сериализации объектов с использованием групп, весьма полезна, однако мне не хватает способа указать, какую группу вы хотите сериализовать в каждом параметре. Пример:

У меня есть статья, связанная с пользователем (автором). Статьи, а также пользователи могут быть сериализованы как "список" или "подробности", однако я хочу, чтобы пользователи были последовательно сериализованы как "список", так что они извлекаются из статьи (поскольку группа "подробности" зарезервирована для использования для извлечения пользователя и только пользователя). Проблема в том, что если я установил сериализатор как "детали", тогда автор также сериализуется как "детали".

На мой взгляд, код должен выглядеть примерно так:

/**
 * @var SCA\APIBundle\Entity\User
 * @Groups({"list" => "list", "details" => "list"})
 */
private $author;

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

Любой ключ, как я могу это достичь?

Теги:
jmsserializerbundle

1 ответ

0
Лучший ответ

Это не должно делаться на скомпонованном объекте, а на композиции.

В вашем случае, я полагаю, у вас есть что-то вроде этого:

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;
}

Если вам нужно больше контроля, вы можете определить более явные группы, такие как "список статей", "имя пользователя", "минимальный список пользователей" и т.д.

Это зависит от вас, чтобы выбрать лучшую стратегию для принятия.

  • 0
    Да, это решение, которое я собирался использовать, но я предполагал, что должен быть какой-то другой способ сделать это, так как этот способ немного сложен в обслуживании, если у вас большое количество классов.
  • 0
    @aperezroca, я согласен, что это может быть немного нелогично, но я думаю, это связано с некоторыми ограничениями того, как работает стратегия исключения (отражение)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню