2016-07-19 2 views
1

У меня есть устройства, являющиеся частями брендов и ремонта, являющиеся частью устройств. Теперь я пытаюсь получить простой вызов 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

Вы можете использовать

setCircularReferenceLimit() 

метод для нормализаторов.

Handling Circular References

+0

Это было установлено в 1. Так что я должен установить на 0? Можно ли даже определить, какие данные передаются объекту? Для целей оптимизации не всегда необходимо знать название бренда устройства, поэтому я бы его отключил. – bluppfisk

Смежные вопросы