JMSSerializerBundle:@Group不在父类的父类字段上工作

时间:2016-04-02 08:10:58

标签: php symfony jmsserializerbundle

我正在使用JMSSerializerBundle将我的symfony实体序列化为JSON。我有以下类结构:

abstract class A {}
abstract class B extends A {}
class C extends B {}

现在我想序列化一个类C的对象,所以我定义了一个新的组,比如说“example_group”,并设置@Groups这样的注释:

abstract class A {
    /**
     * @Groups({"example_group"})
     */
    private $a1;

    private $a2;
}

abstract class B extends A {
    /**
     * @Groups({"example_group"})
     */
    private $b1;

    private $b2;
}

class C extends B {
    /**
     * @Groups({"example_group"})
     */
    private $c1;
}

生成的序列化不仅包含C::c1字段,还包含B::b1,但令人惊讶的是不是A::a1。这是预期的行为吗?我还需要包含A::a1。我怎样才能做到这一点?

谢谢。

2 个答案:

答案 0 :(得分:0)

不要忘记为这三个班级设置ExclusionPolicy

use JMS\Serializer\Annotation\ExclusionPolicy

/**
 * @ExclusionPolicy("all")
 */
abstract class A 
{
    // ...
}

/**
 * @ExclusionPolicy("all")
 */
abstract class B extends A 
{
    // ...
}

/**
 * @ExclusionPolicy("all")
 */
class C extends B
{
    // ...
}

通过使用组C序列化example_group,您应该获得通过@Groups注释公开的所有属性。

因此,对于您的实例,您应该$a1$b1$c1呈现。

答案 1 :(得分:0)

您应该覆盖基类用户序列化元数据/配置。对于JMS序列化器,请执行以下操作:

#File: Model.User.yml

FOS\UserBundle\Model\User:
exclusion_policy: ALL
access_type: public_method # defaults to property; can also be set per property
properties:
    email:
        expose: true
        type: string
        groups: [api]
    roles:
        expose: true
        type: array
        groups: [api]