FOSUserBundle + JMSSerializerBundle +公开额外字段

时间:2015-07-14 09:11:57

标签: 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;
    }
}

为简化起见,我需要使用$salt

从用户实体中公开{​​{1}}字段
JMSSerializerBundle

以下是配置:

#AppBundle\Resources\config\serializer\Model.User.yml
FOS\UserBundle\Model\User:
    exclusion_policy: all
    properties:
        salt:
            expose: true

问题,序列化程序也公开了#app\config\config.yml jms_serializer: metadata: auto_detection: true directories: FOSUserBundle: namespace_prefix: "FOS\\UserBundle" path: "@AppBundle/Resources/config/serializer" 字段,我不想要,因为我只需要$name曝光:

$salt

我相信我需要告诉序列化程序使用我的{ "salt": "abcdefg", "name": "Admin" } 的配置而不是FOSUserBundle的基本用户实体,但我不知道如何实现它。

2 个答案:

答案 0 :(得分:4)

这就是我解决问题的方法。我有一个User.php类 从FOS \ UserBundle \ Model \ User继承为BaseUser。我需要从 BaseUser 类和我的用户类控制序列化。

解决方案:您需要2个独立的配置文件来控制每个类。

config.yml

#Serializer configuration
    jms_serializer:
        metadata:
            directories:
                AppBundle:
                    path: "@AppBundle/Resources/config/serializer"
                FOSUB:
                    namespace_prefix: "FOS\\UserBundle"
                    path: "%kernel.root_dir%/serializer/FOSUB"

Model.User.yml

FOS\UserBundle\Model\User:
    exclusion_policy: ALL
    properties:
        id:
            expose: true
        username:
            expose: true
        email:
            expose: true
        enabled:
            expose: true

Entity.User.yml

AppBundle\Entity\User:
    exclusion_policy: ALL
    properties:
        imageAvatar:
            expose: true
        updatedAt:
            expose: true



namespace AppBundle\Entity;

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



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


   /**
     * @ORM\Column(type="string", length=255)
     *
     * @var string
     */
    private $imageAvatar;



    /**
     * @ORM\Column(type="datetime")
     *
     * @var \DateTime
     */
    private $updatedAt;
  

在配置文件中的每次更改后清除缓存。

缓存:明确

答案 1 :(得分:0)

之所以会发生这种情况,是因为您在父实体上使用exclusion_policy: all,而不是在子实体上,而子实体仍然暴露了它的所有属性。

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

any-name:
    namespace_prefix: "My\\FooBundle"
    path: "@MyFooBundle/Resources/config/serializer"

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

#AppBundle\Resources\config\serializer\Entity.User.yml
My\FooBundle\Entity\User:
    exclusion_policy: all
    properties:
        salt:
            expose: true