我已设置并运行SonataUserBundle
和JMSSerializerBundle
。现在我试图覆盖Application\Sonata\UserBundle\Entity\User.
的序列化程序配置
我用于此配置的XML文件由SonataEasyExtendsBundle
生成:
Application\Sonata\UserBundle\Resources\config\serializer\Entity.User.xml
看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<serializer>
<!--
This file has been generated by the EasyExtends bundle
( http://sonata-project.org/bundles/easy-extends )
@author <yourname> <youremail>
-->
<class name="Application\Sonata\UserBundle\Entity\User" exclusion-policy="all" xml-root-name="user">
<property name="id" type="integer" expose="true" since-version="1.0" groups="sonata_api_read,sonata_api_write,sonata_search" />
</class>
</serializer>
我还配置了app/config/config.yml
来使用该XML文件:
jms_serializer:
metadata:
auto_detection: true
directories:
ApplicationSonatUserBundle:
path: @ApplicationSonataUserBundle/Resources/config/serializer
namespace_prefix: Application\Sonata\UserBundle\Model
现在根据配置我应该只在对象被序列化时看到id字段。但是当我测试这个时,所有的领域都暴露了。这显然是个坏主意。
我正在使用FOSRestBundle
来实现使用它的API层。如果我跑:
get_class($this->getUser())
//outputs Application\Sonata\UserBundle\Entity\User
所以FOSUserBundle
正在使用正确的User
实体。
我已经看了几个小时了,无法找到问题所在......
答案 0 :(得分:2)
终于解决了这个问题,显然你必须引用属性实际所在的类。在这种情况下,我试图公开驻留在FOS / UserBundle / Model / Entity中的属性id。我最终配置了Sonata / UserBundle / Model / User和FOS用户类的属性。我的XML现在看起来像这样:
<serializer>
<class name="Sonata\UserBundle\Model\User" exclusion-policy="all" xml-root-name="user">
<property name="dateOfBirth" type="DateTime" expose="true" since-version="1.0" groups="profile" />
<property name="firstname" type="string" expose="true" since-version="1.0" groups="profile" />
<property name="lastname" type="string" expose="true" since-version="1.0" groups="profile" />
<property name="website" type="string" expose="true" since-version="1.0" groups="profile" />
<property name="locale" type="string" expose="true" since-version="1.0" groups="profile" />
<property name="phone" type="string" expose="true" since-version="1.0" groups="profile" />
</class>
<class name="FOS\UserBundle\Model\User" exclusion-policy="all" xml-root-name="user">
<property name="id" type="integer" expose="true" since-version="1.0" groups="profile" />
<property name="username" type="string" expose="true" since-version="1.0" groups="profile" />
<property name="email" type="string" expose="true" since-version="1.0" groups="profile" />
<property name="roles" type="array" expose="true" since-version="1.0" groups="profile" />
</class>
</serializer>