Symfony 2.7 + JMS-сериализатор + MaxDepth

Я использую пакет JMS Serializer для сериализации объектов Symfony в json. Все работает нормально, пока я не начну использовать аннотацию MaxDepth, чтобы избежать глубокой рекурсии.

У меня есть сущность под названием «Категория», в которой есть «Подкатегории». Если я не использую аннотацию MaxDepth при сериализации, она отлично работает и генерирует объект json, как и должно быть, с полным деревом подкатегорий:

{
    "id": 1,
    "name": "Category 1",
    "subcategories": [{
        "id": 3,
        "name": "Category 1-1",
        "subcategories": [{
            "id": 7,
            "name": "Category 1-1-1",
            "subcategories": []
        }]
    }, {
        "id": 4,
        "name": "Category 1-2",
        "subcategories": []
    }]
}

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

class Category
{
    ....

    /**
    * @ORM\OneToMany(targetEntity="Category", mappedBy="parentCategory")
    * @MaxDepth(1) 
    */
    private $subcategories;    

    ....    

}

Но по какой-то причине я не понимаю, когда включаю проверки maxdepth, используя следующий код:

$serializedObj = $jms->serialize($obj, 'json', SerializationContext::create()->enableMaxDepthChecks());

Я получаю этот странный результат (подкатегория не закодирована, но он знает, что их две):

{
    "id": 1,
    "name": "Categoria 1",
    "subcategories": [{}, {}]
}

Есть идеи о том, что происходит?

Спасибо!


person Gonzalo    schedule 06.10.2015    source источник
comment
Вы пробовали установить @MaxDepth (2)?   -  person Max Lipsky    schedule 06.10.2015
comment
Я столкнулся с той же проблемой. Я схожу с ума, потому что аннотация MaxDepth не работает (да, у меня serializerEnableMaxDepthChecks=true).   -  person Lord Zed    schedule 17.11.2015
comment
Лексс имеет право. В дочерних объектах вы должны установить группы так же, как вы передаете параметр setGroups () (в методе контроллера)   -  person Paweł Owczarek    schedule 11.05.2017
comment
Привет, спасибо за прекрасный ответ. можно ли упомянуть @MaxDepth на классе дыр ??   -  person famas23    schedule 06.07.2018


Ответы (2)


У меня была аналогичная проблема, и я исправил это так:

В Студенческом классе:

/**
 * @ORM\ManyToOne(targetEntity="school", inversedBy="student")
 * @ORM\JoinColumn(name="school_id", referencedColumnName="id")
 * @JMS\Serializer\Annotation\MaxDepth(2)
 */
protected $school;

В контроллере Student:

/**
 * @FOS\RestBundle\Controller\Annotations\View(serializerEnableMaxDepthChecks=true)
 */
public function getStudentsAction() {
    $students = $this->getDoctrine()
    ->getRepository('AppBundle:Student')
    ->findAll();
    return $students;
}

Ничего из school не сериализуется, это именно то, что мне нужно!

person marijnz0r    schedule 26.02.2016
comment
Привет, спасибо за прекрасный ответ. можно ли упомянуть @MaxDepth на классе дыр ?? - person famas23; 06.07.2018
comment
Я думаю, что к свойству можно добавить только аннотацию MaxDepth, но, возможно, ошибаюсь. - person marijnz0r; 06.07.2018

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

person Lexxx    schedule 14.12.2015