Я пытаюсь создать эффективные 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
, что я начинаю сомневаться, что это хороший подход.
Как вы думаете? Каков ваш опыт? Какой подход лучше и почему?
Рассматривали ли вы с помощью [Fractal] (http://fractal.thephpleague.com/) ? Это хорошая промежуточная точка между JMSSerializer и ручным построением массива JSON в ваших контроллерах. – dchesterton
в чем проблема при использовании JMSSerializerBundle? этот пакет действительно работает как шарм большую часть времени. – VaN
Вы также можете сделать свои сущности сериализованными. Теперь это облегчит ваш подход, если я так скажу. Пример сериализуемого пользовательского объекта можно найти здесь: http://symfony.com/doc/current/security/entity_provider.html#create-your-userent –