2016-12-06 8 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 –

答えて

関連する問題