2013-03-15 7 views
7

として任意のHTMLコントローラは、IはSymfony2の中で作成された完成ウェブサイトを持っていると私は今、サイトの機能の多くは、現在のモバイルアプリで利用できるようにしたいです。
私の考えは、単純なURL変数を追加することで、関連するページリクエストのすべての変数をJSONで出力します。Symfony2の出力JSON

だから私は

www.domain.com/profile/john-smith 

に接続するかどうかは、今のようにHTMLページを返します。
しかし、私は

www.domain.com/profile/john-smith?app 

に行く場合、それは名前、年齢、その他のプロファイル情報のJSONオブジェクトを返します。
私のアプリケーションコードはJSONを受け取り、処理します。

本当にJSONで表示され、HTMLは表示されない変数なので、セキュリティ上の問題はありません。私は、すべてのアプリのコードを作成し、単純にJSONで変数を返し、それ以上のサーバ側の作業の必要性を救うウェブページと同じURLへの呼び出しを行うことができます上記を行うことにより

質問です:私はすべてのコントローラを変更せずにこれを行うだろうか?

私はイベントリスナーがそれを行うだろうと想像することはできませんか?たぶん私は、応答オブジェクトを傍受し、すべてのHTMLを取り除くことができますか?

これを行うためのベストプラクティスの方法についてのご意見はありますか?コード作成はかなり簡単ですが、私はそのデザインの周りに頭を抱えようとしています。

答えて

5

このタスク

article_show: 
    path:  /articles/{culture}/{year}/{title}.{_format} 
    defaults: { _controller: AcmeDemoBundle:Article:show, _format: html } 
    requirements: 
     culture: en|fr 
     _format: html|rss 
     year:  \d+ 

のためのルートを設定する正しい方法がありますが、これはまだその出力を処理するために追加的な制御構造を持つすべてのコントローラを編集する必要でしょう。

この問題を解決するには、2つのことができます。

  1. template.'.$format.'.twigtemplate.html.twigにHTMLを置き換え、その後、あなたが持っている各テンプレートのJSONテンプレートを作成します。 (ユーザーがURLの検証なしでパラメータを渡すことができないように注意してください。これは重大なセキュリティリスクです)。

  2. 独自の抽象コントローラクラスを作成し、レンダリングメソッドをオーバーライドして、要求されたフォーマットをチェックし、それに基づいて出力を提供します。

    class MyAbstractController extends Symfony\Bundle\FrameworkBundle\Controller\Controller 
    { 
        public function render($view, array $parameters = array(), Response $response = null) 
        { 
         if($this->getRequest()->getRequestFormat() == 'json') 
         { 
          return new Response(json_encode($parameters)); 
         } 
         else 
         { 
          parent::render($view, $parameters, $response); 
         } 
        } 
    } 
    

上記のコードはプロトタイプですNOTE、それは箱から出して動作するように期待しないでください。何のコードの重複、およびより少ないセキュリティ上の問題がないため

は、私は個人的には、第二の方法より正しいと考えるでしょう。

+1

* _format * http://symfony.com/doc/current/book/routing.html#advanced-routing-exampleの詳細 – CSchulz