我有一个使用注释序列化的对象。它工作正常。
如果我使用的是yaml配置,它也可以正常工作。
我的问题是我想在不同的上下文中使用两者。假设在控制器 1 中,我想使用注释配置,而在控制器 2 中,我想使用 yaml 配置。我想这样做,因为我需要在这些输出中有不同的字段名称。
- 我尝试仅使用注释用新实例覆盖序列化程序。
- 我将 jmsserializer 服务配置更改为不使用特定的驱动程序。它有效,但我无法选择要动态激活哪一个。
- 我尝试在容器中选择驱动程序,但无法使其工作。
这可能吗?我错过了什么吗?
我不
明白你如何实现这一目标。
但是,如果要以不同的方式公开属性,则可以使用排除策略创建对象的不同视图。
例:
/**
* @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
不是必需的,您可以将其用于自定义名称。
有关详细信息,请参阅文档的排除策略部分。
希望这可以成为您的替代方案。