Как выбрать драйвер для сериализации / десериализации с помощью jmsserializer

У меня есть объект, который я сериализую, используя аннотации. Работает нормально.

Если я использую конфигурацию yaml, она также работает нормально.

Моя проблема в том, что я хочу использовать оба в другом контексте. Допустим, в первом контроллере я хочу использовать конфигурацию аннотации, а во втором - я хочу использовать конфигурацию yaml. Я хочу сделать это, потому что мне нужно иметь разные имена полей в этих выходных данных.

  • Я попытался переопределить сериализатор новым экземпляром, используя только аннотацию.
  • Я изменяю конфигурацию сервиса jmsserializer, чтобы не использовать определенные драйверы. Это сработало, но я не могу выбрать, какой из них активировать динамически.
  • Я попытался выбрать драйвер в контейнере, но не смог заставить его работать.

Это возможно? Я что-то пропустил?

1 ответ

Я не понимаю, как вы можете достичь этого.

Но если вы хотите выставить свойство по-другому, вы можете создать различные представления вашего объекта, используя стратегию исключения.

Пример:

/**
 * @JMS\ExclusionPolicy("all")
 * @ORM\Entity
 */
class FooBar
{    
    /**
     * @ORM\Column(type="string")
     * @JMS\Groups({"foo"})
     */
    protected $name; // output 'name'

    /**
     * @ORM\Column(type="string")
     * @JMS\SerializedName("foo_bar_name")
     * @JMS\Accessor(getter="getName", setter="setName")
     * @JMS\Groups({"bar"})
     */
    protected $fooName; // output 'foo_bar_name'

    // ...

    public function setName($name)
    {
        $this->address = $name;

        return $this;
    }

    public function getName()
    {
        return $this->name;
    }
}

Таким образом, свойство может быть сериализовано под двумя разными именами:

use JMS\Serializer\SerializationContext;

$serializer->serialize(new FooBar(), 'json', SerializationContext::create()->setGroups(array('foo')));

//will output $name as 'name'

$serializer->serialize(new FooBar(), 'json', SerializationContext::create()->setGroups(array('bar')));

//will output $fooName as 'foo_bar_name'

Обратите внимание @JMS\SerializedName не является обязательным, вы можете использовать его для пользовательских имен.

Подробнее смотрите в части стратегии исключения в документации.

Надеюсь, что это может быть альтернативой для вас.

Другие вопросы по тегам