2016-12-06 5 views
0

Я пытаюсь создать эффективные JSON Контроллеры отклика для AJAX. До сих пор вместо передачи всей сущности на JsonResponse Я создаю массивы с необходимыми данными внутри, где я могу легко управлять выходными данными, оставляя меньше работы для JavaScript. Мои действия выглядят примерно так:Symfony2 - объекты с отношениями как ответ json

public function getOffersAction(Request $request) 
{ 
    if (!$request->isXmlHttpRequest()) { 
     return new JsonResponse(array('message' => 'You can access this only using Ajax!'), 400); 
    } 

    /** @var OfferRepository $offerRepository */ 
    $offerRepository = $this->getDoctrine()->getRepository('IndexBundle:Offer'); 
    $offers = $offerRepository->findBy(array('state' => 'available')); 

    $offersArray = array(); 
    /** @var Offer $offer */ 
    foreach ($offers as $offer) { 
     $areasArray = array(); 
     foreach ($offer->getAreas() as $area) { 
      $areasArray[] = array(
       'name' => $area->getName() 
      ); 
     } 

     $offersArray[] = array(
      'id'  => $offer->getId(), 
      'code'  => $offer->getCode(), 
      'title'  => $offer->getTitle(), 
      'city'  => $offer->getCity(), 
      'country' => $offer->getCountry()->getName(), 
      'latitude' => $offer->getLatitude(), 
      'longitude' => $offer->getLongitude(), 
      'areas'  => $areasArray 
     ); 
    } 

    return new JsonResponse($offersArray, 200); 
} 

Все хорошо, ajax работает быстро.

На этом этапе я начал поиск в поисковых системах, если это правильный подход к нему. Я узнал о JMSSerializerBundle, который сериализует сущности. Я попытался использовать его, но мне приходится сталкиваться с проблемами сериализации отношений и доступа к данным связанных объектов с использованием JS. Это настолько сложно, что так много делается для JS, что я начинаю сомневаться, что это хороший подход.

Как вы думаете? Каков ваш опыт? Какой подход лучше и почему?

+0

Рассматривали ли вы с помощью [Fractal] (http://fractal.thephpleague.com/) ? Это хорошая промежуточная точка между JMSSerializer и ручным построением массива JSON в ваших контроллерах. – dchesterton

+2

в чем проблема при использовании JMSSerializerBundle? этот пакет действительно работает как шарм большую часть времени. – VaN

+0

Вы также можете сделать свои сущности сериализованными. Теперь это облегчит ваш подход, если я так скажу. Пример сериализуемого пользовательского объекта можно найти здесь: http://symfony.com/doc/current/security/entity_provider.html#create-your-userent –

ответ

0

Я предпочитаю подход нормализатора/сериализатора symfony. http://symfony.com/doc/current/components/serializer.html Как описан выше, вы можете overide сериалайзера, чтобы сериализовать объект в том же специальном способе для всей применения

enter image description here