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 из объекта пользователя, используя 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"
}

Я считаю, что мне нужно указать сериализатору использовать конфигурацию для моего AppBundle\Entity\User вместо базового пользовательского объекта из FOSUserBundle, но я понятия не имею, как это реализовать.


person Yuriy Sorokin    schedule 14.07.2015    source источник


Ответы (2)


Вот так я решил проблему. У меня есть класс User.php, который наследуется от FOS\UserBundle\Model\User как BaseUser. Мне нужно контролировать сериализацию как из моего класса BaseUser, так и из моего класса User.

Решение: вам нужно 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;

Очищайте кеш после каждого изменения файлов конфигурации.

кеш:очистить

person Carlos Martinez Ival    schedule 19.04.2017

Это происходит потому, что вы используете exclusion_policy: all для родительской сущности, а не для дочерней сущности, которая по-прежнему раскрывает все свои свойства.

вы должны переключиться на свой пакет в конфигурации (config.yml) в каталогах jms_seriazlier:.

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
person D_R    schedule 14.07.2015
comment
Дэн, спасибо за ответ. Дело в том, что моя сущность User хранится в src/AppBundle/Entity/User/User.php, и куда бы я ни положил свой файл yml (src/AppBundle/Resources/config/serializer/Entity.User.yml или src/AppBundle/Resources/config/serializer/Entity.User.User.yml), он не работает, выставляет все поля, похоже сериализатор не может найти этот yml конфиг . - person Yuriy Sorokin; 14.07.2015
comment
как насчет пространства имен в файле yml? должно быть так: AppBundle\Entity\User\User: - person D_R; 14.07.2015
comment
Вот мой src/AppBundle/Resources/config/serializer/Entity.User.User.yml AppBundle\Entity\User\User: exclusion_policy: all properties: salt: expose: true - person Yuriy Sorokin; 14.07.2015