Как выбрать драйвер для сериализации / десериализации с помощью 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
не является обязательным, вы можете использовать его для пользовательских имен.
Подробнее смотрите в части стратегии исключения в документации.
Надеюсь, что это может быть альтернативой для вас.