FOSUserBundle + JMSSerializerBundle +暴露额外字段

Yur*_*kin 5 symfony fosuserbundle jmsserializerbundle

User使用一个附加字段序列化实例时出现问题$name,这会从FOSUserBundle扩展基本用户:

<?php
namespace AppBundle\Entity\User;

use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as BaseUser;

/**
 * User
 */
class User extends BaseUser
{
    /**
     * @var string
     */
    private $name;

    /**
     * Set name
     * @param string $name
     * @return User
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }
}
Run Code Online (Sandbox Code Playgroud)

为简化起见,我需要仅$salt使用用户实体公开字段JMSSerializerBundle

#AppBundle\Resources\config\serializer\Model.User.yml
FOS\UserBundle\Model\User:
    exclusion_policy: all
    properties:
        salt:
            expose: true
Run Code Online (Sandbox Code Playgroud)

这是配置:

#app\config\config.yml
jms_serializer:
    metadata:
        auto_detection: true
        directories:
            FOSUserBundle:
                namespace_prefix: "FOS\\UserBundle"
                path: "@AppBundle/Resources/config/serializer"
Run Code Online (Sandbox Code Playgroud)

问题是序列化程序还暴露了$name字段,我不想要这个字段,因为我只需$salt暴露:

{
    "salt": "abcdefg",
    "name": "Admin"
}
Run Code Online (Sandbox Code Playgroud)

我相信我需要告诉序列化器使用配置为我AppBundle\Entity\User而不是FOSUserBundle中的基本用户实体,但我不知道如何实现它.

Dan*_*vah 0

发生这种情况是因为您在父实体上使用exclusion_policy: all,而不是在子实体上使用,子实体仍然公开其所有属性。

config.yml您应该在jms_seriazlier:directories 下的配置 ( ) 中切换到您的包。

any-name:
    namespace_prefix: "My\\FooBundle"
    path: "@MyFooBundle/Resources/config/serializer"
Run Code Online (Sandbox Code Playgroud)

现在您可以使用相同的配置来仅公开所需的属性。

#AppBundle\Resources\config\serializer\Entity.User.yml
My\FooBundle\Entity\User:
    exclusion_policy: all
    properties:
        salt:
            expose: true
Run Code Online (Sandbox Code Playgroud)