2017-01-02 16 views
5

У меня проблема с JMS-сериализатором. Когда я использую группы, JMS не сериализует мои дочерние классы, но когда я не использую группы, все в порядке. Что я делаю неправильно?JMS Сериализатор не сериализует дочерние классы

$context = SerializationContext::create()->enableMaxDepthChecks(); 
    $context->setGroups(['clientapi']); 

    $contextWithoutGroup = SerializationContext::create()->enableMaxDepthChecks(); 

    /** @var Serializer $serializer */ 
    $serializer = $this->container->get('jms_serializer'); 
    $dataClientApi = $serializer->serialize($documentBundle->getFolderDocumentsForClientApi(
     $this->getUserFromParam($params), $folder, $categories, $tags 
    ), 'json', $context); 

    $dataWithout = $serializer->serialize($documentBundle->getFolderDocumentsForClientApi(
     $this->getUserFromParam($params), $folder, $categories, $tags 
    ), 'json', $$contextWithoutGroup); 

подавай:

$dataClientApi = '{"0":{"author":{}}}'; 
$dataWithout = '{"0":{"author":{id: 2}}}'; 

И что мои классы. Родитель: класс

/** 
* Document 
* 
* @ORM\Table(name="documents") 
* @ORM\Entity(repositoryClass="AppBundle\Entity\DocumentRepository") 
* @ORM\EntityListeners({"DocumentListener"}) 
* @JMS\ExclusionPolicy("all") 
* @JMS\AccessorOrder("custom", custom = {"id", "folderId", "title"}) 
*/ 
class Document implements ResourceInterface 
{ 

    use Traits\SortableTrait; 
    use Traits\TimestampableTrait; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(type="integer", name="id") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @JMS\Groups({"clientapi"}) 
    * @JMS\Expose() 
    */ 
    protected $id; 

    /** 
    * @var \AppBundle\Entity\Author 
    * 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Author") 
    * @ORM\JoinColumn(name="author_id", nullable=true, referencedColumnName="id") 
    * @JMS\Groups({"clientapi"}) 
    * @JMS\MaxDepth(3) 
    * @JMS\Expose() 
    */ 
    protected $author; 

И ребенок:

/** 
* Author 
* 
* @ORM\Entity 
* @ORM\Table(name="author") 
* @Gedmo\Uploadable(pathMethod="getDirPath", allowOverwrite=false, filenameGenerator="SHA1", appendNumber=true) 
* @JMS\ExclusionPolicy("none") 
* @JMS\AccessorOrder("custom", custom = {"id"}) 
*/ 
class Author implements ResourceInterface, FileInterface 
{ 
    const DIR_PATH = 'web/system/authors'; 

    use Traits\FileTrait; 
    use Traits\TimestampableTrait; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    * @JMS\Groups({"clientapi"}) 
    * @JMS\Expose() 
    */ 
    protected $id; 
+0

Я не мог воспроизвести проблему с кодом вы предоставили на чистый проект ... – Hammerbot

ответ

0

в дочернем классе попробуйте изменить

@JMS\ExclusionPolicy("none") 

в

@JMS\ExclusionPolicy("all") 

"никто" не баловаться с @Groups

+0

попробовал это, и ничего не меняется, к сожалению:/ –

+1

вы используете кэш для аннотаций или вы в prod environnement? в вашем контроллере есть ошибка: $$ contextWithoutGroup вы помещаете в два $ –

+0

да, но эта ошибка только что сделана здесь (я изменил имена переменных, чтобы сделать образец более читаемым) и на 100% не является кеш-файлом. я отключил кеш, я всегда также очищаю кеш и т. д., которые ничего не меняют. (и я уверен, что кеш-память abotu, потому что я вижу изменения в «родительских» классах) –

-1

Я думаю, вы должны использовать эту аннотацию: «@discriminator» Так что прочитайте это! У меня была такая же проблема, и я нашел свою проблему :) (Извините, я использую YML-размытие аннотаций, но задание одно и то же) В моем младшем уровне абзаца сущность, вот дискриминатор с именем поля "class_name" (и это определено в свойствах!): (YML файл: Entity.Bases.Basentity.yml - не забудьте ".Bases" или другие подкаталоги в каталоге Entity!)

AppBundle\Entity\Bases\Basentity: 
exclusion_policy: ALL 
discriminator: 
    field_name: class_name 
    disabled: false 
    map: 
     Basentity: 'AppBundle\Entity\Bases\Basentity' 
     Item: 'AppBundle\Entity\Bases\Item' 
     Tier: 'AppBundle\Entity\Bases\Tier' 
     Atelier: 'AppBundle\Entity\Atelier' 
     Tva: 'AppBundle\Entity\Tva' 
     Language: 'AppBundle\Entity\Language' 
     User: 'UserBundle\Entity\User' 
properties: 
    id: 
     type: integer 
     … 
    class_name: 
     type: string 
     accessor: 
      getter: getShortName 

в настоящее время в определение моего объекта (расширяет мой Basentity.php), вы можете добавить его собственные поля. Я только что обнаружил это, так что не могу сказать больше ...

AppBundle\Entity\Language: 
exclusion_policy: ALL 
properties: 
    name: 
     type: string 
     groups: ['paged', 'user', 'tva', 'language'] 
    slug: 
     type: string 
     groups: ['paged', 'user', 'tva', 'language'] 
    … 

Вы можете иметь более двух уровней, это работает. Надеюсь, что поможет ...

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

  • Нет связанных вопросов^_^