2015-07-14 3 views
4

у меня есть проблема, когда сериализации User экземпляр с одним дополнительным полем $name, который расширяет базу пользователей FOSUserBundle:FOSUserBundle + JMSSerializerBundle + выставляя дополнительные поля

<?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" 
} 

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

ответ

0

Это происходит потому, что вы используете 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 
+0

Дэн, спасибо за ответ. Дело в том, что мой объект '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. –

+0

Что такое пространство имен в файле yml? это должно быть так: 'AppBundle \ Entity \ User \ User:' – DanR

+0

Вот мой 'SRC/AppBundle/Ресурсы/конфигурации/сериализатору/Entity.User.User.yml' AppBundle \ Entity \ User \ User: исключение_политика: все Свойства: соль: выставить: true –

3

Вот как я решил проблему. У меня есть класс 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; 

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

кэша: прозрачный

Смежные вопросы