Сериализатор FOSRestBundle выдает ошибку рекурсии с использованием унаследованных сущностей

Я разрабатываю приложение, которое наследует абстрактные классы. Эти абстрактные классы имеют собственное отображение для сериализатора, как показано в примере ниже.

Hezten\CoreBundle\Model\Enroled:
    exclusion_policy: ALL

И абстрактный класс:

<?php

namespace Hezten\CoreBundle\Model;

abstract class Enroled implements EnroledInterface
{
    protected $student;

    protected $subject;

    //Some functions...

}

Класс, который наследует предыдущий класс, выглядит следующим образом

<?php

namespace XXX\XXXBundle\Entity;

use JMS\Serializer\Annotation\SerializedName;
use JMS\Serializer\Annotation\ExclusionPolicy;
use JMS\Serializer\Annotation\Exclude;

use Doctrine\ORM\Mapping as ORM;

use Hezten\CoreBundle\Model\Enroled as BaseEnroled;

/** 
 * @ORM\Entity 
 * @ExclusionPolicy("NONE")
 */
class Enroled extends BaseEnroled
{
    /** @ORM\Id  
     *  @ORM\ManyToOne(targetEntity="XXX\XXXBundle\Entity\Student", inversedBy="enroled")
     * @Exclude
     */
    protected $student;

    /** @ORM\Id  
     *  @ORM\ManyToOne(targetEntity="XXX\XXXBundle\Entity\Subject", inversedBy="enroled")
     *  @Exclude
     */
    protected $subject;

    /** @ORM\Column(type="boolean") */
    private $field0;

    /** @ORM\Column(type="boolean") 
     */
    private $field1;

    /** @ORM\Column(type="boolean") */
    private $field2;
 }

Выброшенная ошибка говорит об этом:

Warning: json_encode() [<a href='function.json-encode'>function.json-encode</a>]: recursion detected in C:\xampp\htdocs\Project\vendor\jms\serializer\src\JMS\Serializer\JsonSerializationVisitor.php line 29

Наверняка я делаю что-то не так, так как никакие объекты не выставляются, только три поля объекта «Зарегистрировано» в соответствии с сопоставлениями, но я понятия не имею. Я потратил пару дней, пытаясь понять, в чем ошибка, но безуспешно.

Каков правильный способ сопоставления унаследованных свойств?

Обновить

Код, используемый для сериализации JSON с помощью FOSRestBundle:

    $students = $this->get('hezten_core.manager.enroled')->findEnroledBySubject($subject);

    $view = View::create()
    ->setStatusCode(200)
    ->setFormat('json')
    ->setData($students);

    return $this->get('fos_rest.view_handler')->handle($view);

person Gorka Lauzirika    schedule 17.07.2013    source источник
comment
Взгляните на stackoverflow.com/questions/6706485/... и... stackoverflow.com/questions/11851197/ ... Можете ли вы предоставить код, который вы используете для сериализовать в JSON?   -  person Nicolai Fröhlich    schedule 17.07.2013
comment
Попробуйте установить @ExclusionPolicy на "none" вместо "NONE", чтобы соответствовать значениям документации... но я не думаю, что это все. jmsyst.com/libs/serializer/master/reference/   -  person Nicolai Fröhlich    schedule 17.07.2013
comment
Как именно будет выглядеть ваш сериализованный вывод JSON?   -  person Nicolai Fröhlich    schedule 17.07.2013
comment
@nifr Спасибо за помощь, но строчные буквы не работают. Я предполагаю, что проблема связана с наследованием, поскольку у меня есть другая версия, работающая с тем же кодом сериализации, но без использования наследования для сущностей.   -  person Gorka Lauzirika    schedule 18.07.2013
comment
Я не уверен, чего вы пытаетесь достичь ... хотите ли вы иметь свойства студента и предмета в своем xml или нет? ... просто чтобы понять это правильно ... вы говорите, что другие свойства включены в вывод json ... вы явно исключаете студента и субъекта ... дважды ... это то, что вы хотите? Когда именно выбрасывается исключение? если вы добавите сопоставление в свой расширяющийся объект?   -  person Nicolai Fröhlich    schedule 18.07.2013
comment
@nifr Ну... Я пытаюсь избежать ошибки рекурсии, удаляя поля ManyToOne с помощью @Exclude. В финальной версии предметы и ученики будут отображаться в формате json. Мой вопрос больше связан с тем, как реализовать сериализацию при наследовании от других классов, а не с поиском правильного способа реализации именно этого примера, поскольку у меня есть рабочий пример этого вызова API, но без наследования от родительского класса. Спасибо!   -  person Gorka Lauzirika    schedule 18.07.2013
comment
Если я удаляю наследование из класса Enroled, сериализатор работает как положено... Я что-то упускаю...   -  person Gorka Lauzirika    schedule 18.07.2013


Ответы (1)


Наконец-то API работает... Мне пришлось переопределить метаданные классов, которые я наследовал, добавив следующие строки в config.yml

jms_serializer:
    metadata:
        directories:
            HeztenCoreBundle:
                namespace_prefix: "Hezten\\CoreBundle"
                path: "%kernel.root_dir%/serializer/HeztenCoreBundle"

В пути, выбранном выше, я добавил один файл yml для каждой политики исключения параметров модели во ВСЕ:

Hezten\CoreBundle\Model\Enroled:
    exclusion_policy: ALL

И я использовал аннотации к сущностям, которые наследовали эти модели, чтобы предоставить необходимую информацию.

Я не знаю, лучший ли это подход, но мне он подходит.

person Gorka Lauzirika    schedule 18.07.2013