Php 如何选择要使用jmsserializer进行序列化/反序列化的驱动程序

Php 如何选择要使用jmsserializer进行序列化/反序列化的驱动程序,php,symfony,jmsserializerbundle,Php,Symfony,Jmsserializerbundle,我有一个使用注释序列化的对象。它很好用 如果我使用yaml配置,它也可以正常工作 我的问题是我想在不同的上下文中使用这两种语言。假设在控制器1中,我想使用注释配置,在控制器2中,我想使用yaml配置。我想这样做是因为我需要在这些输出中有不同的字段名 我试图用一个只使用注释的新实例覆盖序列化程序 我将jmsserializer服务配置更改为不使用特定的驱动程序。它起作用了,但我无法选择动态激活哪一个 我试图在容器中选择驱动程序,但无法使其工作 这可能吗?我错过了什么吗?我不知道你怎么能做到这一

我有一个使用注释序列化的对象。它很好用

如果我使用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
不是必需的,您可以将其用于自定义名称

请参阅文档部分的更多信息


希望这可以成为您的一个替代方案。

我想这样做,但它在我的用例中不起作用,因为我希望相同的属性以不同的名称公开。?这就是我给你看的
$fooName
返回序列化中
$name
的值。它只是一个具有不同名称的假属性,使用相同的setter和getter。另外,
$fooName
总是返回
$name
的值。我会考虑的。ThanksIt比以两种不同的格式创建对象的两个不同视图更简洁,而且它代表更少的工作。