Сериализатор 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;
3 ответа
Вы должны проверить, не смешивает ли сериализатор, определенный аннотациями, и файл.yml. Это часто делает трудно отладить проблемы.
В детском классе попробуйте изменить
@JMS\ExclusionPolicy("none")
в
@JMS\ExclusionPolicy("all")
"никто" не работает с @Groups
Я думаю, что вы должны использовать эту аннотацию: "@discriminator" Так что читайте это! https://jmsyst.com/libs/serializer/master/reference/annotations меня была такая же проблема, и я нашел свою проблему:) (Извините, я использую нестабильные аннотации YML, но работа такая же) Уровень абстрактной сущности, здесь есть дискриминатор с полевым именем "имя_класса" (и определен в свойствах!): (yml file: Entity.Bases.Basentity.yml - не забывайте ".Bases" или другие подкаталоги в вашей сущности каталог!)
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']
…
Вы можете иметь более двух уровней, это работает. Надеюсь, что это поможет вам...