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

时间:2016-02-18 10:29:13

标签: php symfony jmsserializerbundle

我有一个使用注释序列化的对象。它工作正常。

如果我使用的是yaml配置,它也能正常工作。

我的问题是我想在不同的环境中使用它们。让我们说在控制器一中,我想使用注释配置,在控制器二中,我想使用yaml配置。我想这样做是因为我需要在这些输出中使用不同的字段名称。

  • 我尝试使用仅使用注释的新实例覆盖序列化程序。
  • 我将jmsserializer服务配置更改为不使用特定的驱动程序。它有效,但我无法选择动态激活哪一个。
  • 我尝试在容器中选择驱动程序,但我无法使其正常工作。

这可能吗?我错过了什么吗?

1 个答案:

答案 0 :(得分: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不是必需的,您可以将其用于自定义名称。

请参阅文档的Exclusion strategies部分。

希望这可以替代你。