У меня есть устройства, являющиеся частями брендов и ремонта, являющиеся частью устройств. Теперь я пытаюсь получить простой вызов AJAX, который позволит мне искать устройство по названию торговой марки или имени устройства. К сожалению, я получаю циркулярные ссылки. Даже когда я написал обработчик для циклических ссылок, чтобы ограничить его, я все равно получаю слишком много информации в своих объектах.Доктрина: как ограничить круглые ссылки
Рассмотрим следующую отдачу от сериализации на моем DQL запрос:
[{ "0": { "ID": 1, "имя": "iPhone 1", "логотип": "iPhone1 »,« brand »: {« id »: 2,« name »:« Apple »,« логотип »:« apple »,« devices »: [" iPhone 1 ", {" id ": 2," name " : "iPhone", "логотип": "iphone", "бренд": "Яблоко", "deletedAt": нулевой, "ремонт": []}], "deletedAt": нулевой}, "deletedAt": нулевой,» ремонт ": []}," имя ":" Яблоко "}, {" 0 ": {" ID ": 2," имя ":" iPhone " "логотип": "айфона", "бренд": {" id ": 2," name ":" Apple "," логотип ":" apple "," devices ": [{" id ": 1," name ":" iPhone 1 "," логотип ":" iPhone1 " , "бренд": "Яблоко", "deletedAt": нулевой, "ремонт": []}, "iPhone"], "deletedAt": нулевой}, "deletedAt": нулевой, "ремонт": []},» name ":" Apple "}]
Здесь мне даже не нужен ремонт вообще. Однако, поскольку в ссылке 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? Можно ли даже определить, какие данные передаются объекту? Для целей оптимизации не всегда необходимо знать название бренда устройства, поэтому я бы его отключил. – bluppfisk