2

我已经设置并运行了SonataUserBundleJMSSerializerBundle现在我正在尝试覆盖Application\Sonata\UserBundle\Entity\User. 我用于此配置的 XML 文件的序列化程序配置是由SonataEasyExtendsBundlein: 生成的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实体也是如此。

我一直在看这个几个小时,找不到问题所在......

4

1 回答 1

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> 
于 2014-08-20T16:04:44.617 回答