我将设备作为品牌的一部分,而维修则是设备的一部分。现在我想尝试一个简单的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");
// }
}