【问题标题】:JMSSerializerBundle: @Group not working on parent's parent class fieldsJMSSerializerBundle:@Group 不适用于父类的父类字段
【发布时间】:2016-04-02 08:10:57
【问题描述】:

我正在使用 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。我怎样才能做到这一点?

谢谢。

【问题讨论】:

    标签: php symfony jmsserializerbundle


    【解决方案1】:

    不要忘记为三个类设置ExclusionPolicy

    use JMS\Serializer\Annotation\ExclusionPolicy
    
    /**
     * @ExclusionPolicy("all")
     */
    abstract class A 
    {
        // ...
    }
    
    /**
     * @ExclusionPolicy("all")
     */
    abstract class B extends A 
    {
        // ...
    }
    
    /**
     * @ExclusionPolicy("all")
     */
    class C extends B
    {
        // ...
    }
    

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

    因此,对于您的实例,您应该渲染 $a1$b1$c1

    【讨论】:

    • 如果我为所有类声明 \@ExclusionPolicy("all") ,除非我为我想要序列化的所有属性明确声明 \@expose ,否则不会呈现任何属性。无论如何,我尝试这样做,但我仍然看不到呈现的 $a 属性(与以前相同的结果,正确呈现了 $b 和 $c)。如果我没记错的话,使用 \@Groups 时不需要 \@ExclusionPolicy。
    • 调用序列化器时如何设置组?
    • 这就是我设置组的方式: $serializer->serialize($data, 'json', SerializationContext::create()->setGroups(array('example_group')));跨度>
    • 其中 $groups 等于 array('example_group') ?
    • 我认为这是一个错误,我将实施您的示例并进行调查,然后我会回来。
    【解决方案2】:

    您应该覆盖基类用户序列化元数据/配置。对于 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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      相关资源
      最近更新 更多