JMSSerializerBundle.无法控制第三方元数据

tol*_*gap 25 serialization symfony symfony-2.1 jmsserializerbundle symfony-2.0

我有两个实体,我想用JMSSerializerBundle序列化.该Music实体的映射文件用exclusion_policy: NONE.

Music实体拥有实体的领域UserFOSUserBundle.该User实体有一个映射文件,exclusion_policy: ALL其中设置了几个字段expose: true,因此它们将被序列化.

问题是,该User字段完全序列化.如果我更改User实体的映射文件并不重要.

这是它的样子:

#My/Bundle/Resources/config/serializer/Entity.Music.yml
xxx\xxx\Entity\Music:
    exclusion_policy: NONE

#My/Bundle/Resources/config/serializer/Entity.User.yml
xxx\xxx\Entity\User:
    exclusion_policy: ALL
    properties:
        id:
            expose: true
        username:
            expose: true
        username_canonical:
            exclude: true
        email:
            exclude: true
        email_canonical:
            exclude: true
        enabled:
            exclude: true
        salt:
            exclude: true
        password:
            exclude: true
        last_login:
            exclude: true
        confirmation_token:
            exclude: true
        password_requested_at:
            exclude: true
        groups:
            exclude: true
        locked:
            exclude: true
        expired:
            exclude: true
        expires_at:
            exclude: true
        roles:
            expose: true
        credentials_expired:
            exclude: true
        credentials_expired_at:
            exclude: true
Run Code Online (Sandbox Code Playgroud)

为什么它不引用它自己的映射文件?或者我错了?

我从未尝试过什么

我已阅读第三方元数据文档.它只是说在我的序列化服务中添加一个新目录.我已经这样做了,但我必须扩展FOS\UserBundle\Entity该类,并且也无法访问我试图排除的父受保护字段.

Bor*_*éry 65

我打赌xxx\xxx\Entity\User:指的是你自己的命名空间和类.

如果是,那就是错误的做法.

规则必须应用于属性所在的类.

鉴于您在配置中公开的属性,我猜您正在使用FOSUserBundle.

因此,您必须应用您的规则FOS\UserBundle\Model\User.

然后,您需要添加一个JMSSerializer配置,以指示序列化程序元数据在给定命名空间中的位置.

它应该看起来像:

jms_serializer:
  metadata:
    auto_detection: true
    directories:
      FOSUserBundle:
        namespace_prefix: "FOS\\UserBundle"
        path: "@YourUserBundle/Resources/config/serializer/fos"
Run Code Online (Sandbox Code Playgroud)

fos/目录中,您应该有Model.User.yml

有类似的东西:

FOS\UserBundle\Model\User:
  exclusion_policy: ALL
  properties:
    id:
      expose: true
      groups: [list, details]
    username:
      expose: true
      groups: [details]
    email:
      expose: true
      groups: [me]
    roles:
      expose: true
      groups: [details]
Run Code Online (Sandbox Code Playgroud)

细节:

通过元数据将规则应用于Serializer时,Serializer将查找在元数据中定义的类中声明的属性.

例:

class Foo {
     protected $foo;
}

class Bar extends Foo {
     protected $bar;
}
Run Code Online (Sandbox Code Playgroud)

您的元数据将如下所示:

Foo:
  exclusion_policy: ALL
  properties:
      foo: 
          expose: true

Bar:
  exclusion_policy: ALL
  properties:
      bar: 
          expose: true
Run Code Online (Sandbox Code Playgroud)

以下的例子不是正确的方法

Bar:
  exclusion_policy: ALL
  properties:
      foo: 
          expose: true
      bar: 
          expose: true
Run Code Online (Sandbox Code Playgroud)

如果这样做,则只bar应用(和公开)属性上的规则.