Symfony2 JMSSerializerBundle在YML中公开属性

时间:2015-05-29 14:21:45

标签: symfony configuration-files jmsserializerbundle

我想使用JMSSerializerBundle和FOSRestBundle只暴露我的User类的一些属性。 似乎序列化程序包没有读取我的配置文件。

我的用户类位于src/AppBundle/Entity/User,它扩展了FOSUserBundle用户类。

这是我的用户类:

  <?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as BaseUser;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * User
 *
 * @ORM\Table(name="backoffice_user")
 * @ORM\Entity(repositoryClass="AppBundle\Entity\Repository\UserRepository")
 */
class User extends BaseUser
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     *
     * @ORM\Column(name="lastname", type="string", length=70)
     */
    private $lastname;

    /**
     * @var string
     *
     * @ORM\Column(name="firstname", type="string", length=70)
     */
    private $firstname;
}

这是我的app / config.yml文件

jms_serializer:
    metadata:
        debug: true
        auto_detection: true

src/AppBundle/Resources/config/serializer/Entity.User.yml中的yml mappgin文件:

AppBundle\Entity\User:
    exclusion_policy: ALL
    exclude: true
    properties:
        email:
            exclude: true
            expose: true

该文件未被阅读(或至少未被考虑),因为我的API会返回我实体的所有字段。

我忘记了什么吗?

2 个答案:

答案 0 :(得分:8)

未加载您的映射文件,因为序列化程序将规则应用于定义属性的类。在你的情况下 - 即FOS\UserBundle\Model\User。您需要的是覆盖Third-Party Metadata - 可以在捆绑包documentation

中看到简短的示例

在你的config.yml中,jms_serializer应该如下所示:

jms_serializer:
    metadata:
        auto_detection: true
        directories:
            FOSUserBundle:
                namespace_prefix: "FOS\\UserBundle"
                path: "@AppBundle/Resources/config/serializer"

在目录serializer内,您应该有一个名为Model.User.yml的文件,其配置如下:

FOS\UserBundle\Model\User:
    exclusion_policy: ALL
    # add your desired configuration below.

答案 1 :(得分:0)

JMSSerializer中,您需要为层次结构的每个类都有一个文件。

因此,排除政策仅适用于属性idlastnamefirstname;对于BaseUser,它使用默认规则,即包含所有内容。

要从另一个包中覆盖配置文件,首先需要在配置中设置命名空间的文件夹:

jms_serializer:
    metadata:
        directories:
            FOSUB:
                namespace_prefix: "FOS\\UserBundle"
                path: "%kernel.root_dir%/serializer/FOSUB"

app/serializer/FOSUB/Model.User.yml中添加序列化程序配置文件。有关其他配置选项,请参阅official docs