tol*_*gap 25 serialization symfony symfony-2.1 jmsserializerbundle symfony-2.0
我有两个实体,我想用JMSSerializerBundle序列化.该Music实体的映射文件用exclusion_policy: NONE.
该Music实体拥有实体的领域User从FOSUserBundle.该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应用(和公开)属性上的规则.
| 归档时间: |
|
| 查看次数: |
13448 次 |
| 最近记录: |