Symfony 2.7 + JMS 序列化器 + MaxDepth

标签 symfony jmsserializerbundle

我正在使用 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;    

    ....    

}

但由于某种原因,我不明白何时使用以下代码启用最大深度检查:

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

我得到这个奇怪的结果(没有编码子类别,但它知道有两个):

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

知道发生了什么吗?

谢谢!

最佳答案

我遇到了类似的问题,并通过以下方式解决:

在学生类(class)中:

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

在学生 Controller 中:

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

学校的任何内容都没有被序列化,这正是我所需要的!

关于Symfony 2.7 + JMS 序列化器 + MaxDepth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32974070/

相关文章:

php - jms 序列化器性能问题

symfony - 使用 JMSSerializerBundle 序列化指定字段

php - 在 Symfony2 中扩展超映射类不会在 MySQL 中添加列

forms - 在 Symfony 2 中验证 url 的最佳方法

php - 密码强度不适用于重置密码 Symfony

symfony - JMS 序列化程序 - 交叉引用问题

symfony - 具有关系的实体中的JMSSerializerBundle序列化组

php - JMS 序列化 @VirtualProperty 不起作用

验证来自表单的整数输入