2016-12-06 32 views
0

我正在嘗試爲AJAX創建高效的JSON響應控制器。到目前爲止,我並沒有將整個實體傳遞給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

你有沒有考慮過使用[分形(http://fractal.thephpleague.com/) ?在JMSSerializer和手動構建控制器中的JSON數組之間,這是一個很好的中間地帶。 – dchesterton

+2

使用JMSSerializerBundle時出現什麼問題?這個包在大多數情況下的確很像魅力 – VaN

+0

你也可以讓你的實體序列化。如果我可以這樣說,那現在你的方法會更容易。可以在此處找到序列化的User實體的示例:http://symfony.com/doc/current/security/entity_provider.html#create-your-user-entity –

回答