首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FOSUserBundle + JMSSerializerBundle +公开额外字段

FOSUserBundle + JMSSerializerBundle +公开额外字段
EN

Stack Overflow用户
提问于 2015-07-14 09:11:57
回答 2查看 3.2K关注 0票数 5

当将User实例序列化为一个额外的字段$name时,我遇到了一个问题,该字段从FOSUserBundle扩展了基本用户:

代码语言:javascript
复制
<?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从用户实体中公开JMSSerializerBundle字段。

代码语言:javascript
复制
#AppBundle\Resources\config\serializer\Model.User.yml
FOS\UserBundle\Model\User:
    exclusion_policy: all
    properties:
        salt:
            expose: true

下面是它的配置:

代码语言:javascript
复制
#app\config\config.yml
jms_serializer:
    metadata:
        auto_detection: true
        directories:
            FOSUserBundle:
                namespace_prefix: "FOS\\UserBundle"
                path: "@AppBundle/Resources/config/serializer"

问题是序列化程序也公开$name字段的,我不想这样做,因为我只需要公开$salt

代码语言:javascript
复制
{
    "salt": "abcdefg",
    "name": "Admin"
}

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

EN

回答 2

Stack Overflow用户

发布于 2017-04-19 13:24:58

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

解决方案:您需要两个分开的配置文件来控制每个类。

config.yml

代码语言:javascript
复制
#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

代码语言:javascript
复制
FOS\UserBundle\Model\User:
    exclusion_policy: ALL
    properties:
        id:
            expose: true
        username:
            expose: true
        email:
            expose: true
        enabled:
            expose: true

Entity.User.yml

代码语言:javascript
复制
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;

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

缓存:清除

票数 4
EN

Stack Overflow用户

发布于 2015-07-14 10:18:58

之所以会出现这种情况,是因为您在父实体上使用exclusion_policy: all,而不是在子实体上使用它,而子实体仍然公开它的所有属性。

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

代码语言:javascript
复制
any-name:
    namespace_prefix: "My\\FooBundle"
    path: "@MyFooBundle/Resources/config/serializer"

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

代码语言:javascript
复制
#AppBundle\Resources\config\serializer\Entity.User.yml
My\FooBundle\Entity\User:
    exclusion_policy: all
    properties:
        salt:
            expose: true
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31402421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档