7

Symfony2 で作成された Web サイトが完成しました。サイトの多くの機能をモバイル アプリで利用できるようにしたいと考えています。
私の考えは、単純な URL 変数を追加することで、関連するページ リクエストのすべての変数を JSON で出力することです。

だから私がに接続する場合

www.domain.com/profile/john-smith

現在の HTML ページを返します。
しかし、私が行くなら

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

次に、名前、年齢、その他のプロフィール情報の JSON オブジェクトを返します。
その後、私のアプリ コードは JSON を受け取り、処理します。

それは実際には JSON で提示された変数であり、HTML ではないため、セキュリティ上の問題は見られません。

上記を実行することで、すべてのアプリ コードを作成し、Web ページと同じ URL を呼び出すだけで済みます。これにより、JSON で変数が返され、サーバー側の作業が不要になります。

問題は、すべてのコントローラーを変更せずにこれを行うにはどうすればよいかということです。

イベントリスナーがそれを行うとは想像できませんか? おそらく、Response オブジェクトを傍受して、すべての HTML を削除できますか?

これを行うためのベストプラクティスの方法に関するアイデアはありますか? コーディングはかなり簡単なはずですが、私はその設計に頭を悩ませようとしています。

4

1 に答える 1

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+

ただし、これには、その出力を処理するための追加の制御構造を使用してすべての Controller を編集する必要があります。

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

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

  2. 独自の抽象コントローラー クラスを作成し、render メソッドをオーバーライドして、要求された形式を確認し、それに基づいて出力を提供します。

    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);
            }
        }
    }
    

上記のコードはプロトタイプです。そのままで動作するとは思わないでください。

コードの重複がなく、セキュリティ上の懸念が少ないため、個人的には 2 番目の方法の方が正しいと思います。

于 2013-03-15T15:06:03.290 に答える