学说:如何遏制循环引用

时间:2016-07-19 00:08:45

标签: doctrine-orm symfony

我将设备作为品牌的一部分,而维修则是设备的一部分。现在我想尝试一个简单的AJAX调用,它允许我通过品牌名称或设备名称搜索设备。不幸的是,我得到了循环引用。即使我为循环引用编写了一个处理程序来限制它,我仍然在我的对象中获得太多信息。

考虑以下来自我的DQL查询的序列化返回:

  

[{ “0”:{ “ID”:1, “名称”:“iPhone   1" , “标识”: “iPhone1”, “品牌”:{ “ID”:2, “名”: “苹果”, “标志”: “苹果”, “设备”:“iPhone   1" ,{ “ID”:2, “名”: “iPhone”, “标志”: “iPhone”, “品牌”: “苹果”, “deletedAt”:空, “修理”:[]}],” deletedAt “:空},” deletedAt “:空,” 修理 “:[]},” 名 “:” 苹果 “},{” 0 “:{” ID “:2,” 名 “:” iPhone “”标志 “:” iPhone”, “品牌”:{ “ID”:2, “名”: “苹果”, “标志”: “苹果”, “设备”:[{ “ID”:1, “名”: “苹果手机   1" , “标识”: “iPhone1”, “品牌”: “苹果”, “deletedAt”:空, “修理”:[]}, “iPhone”], “deletedAt”:空}, “deletedAt”:空, “修理”:[]}, “姓名”: “苹果”}]

在这里,我根本不需要修理。但是,由于它在PartEntity中引用,我仍然得到一堆不必要的修复信息。如何限制从对象中获取的数据?

我的控制器代码:

public function ajaxShowDevicesAction(Request $request) {
    //if ($request->isXmlHttpRequest()) {
        $data = $request->query->get('data');
        $result = "";
        if ($data) {
            $result = $this->getDoctrine()->getManager()->getRepository('AppBundle:Device')->findAllByBrandOrName($data);
        }
        if ($result) {
            $encoders = array(new XmlEncoder(), new JsonEncoder());
            $normalizers = array(new GetSetMethodNormalizer());
            $normalizers[0]->setCircularReferenceHandler(function ($object) {
                return $object->getName();
            });
            $serializer = new Serializer($normalizers, $encoders);
            $jsoncontent = $serializer->serialize($result, 'json');
            $response = new Response($jsoncontent);
            return $response;
        }
        // else { # unsure how to give a "no results" response
        //     $response = new Response(json_encode(array()));
        //     $response->headers->set('Content-Type', 'application/json');
        //     return $response;
        // }
    // } else {
    //     throw new HttpException(403, "Ajax access only");
    // }
}

1 个答案:

答案 0 :(得分:0)

您可以使用

setCircularReferenceLimit()

规范化器的方法。

Handling Circular References