2013-06-25 5 views
6

ZF2文書にはCreating and Registering Alternate Rendering and Response Strategiesが記載されています。私はそれを読んだことがありますが、私は実際に戦略をどのように使用するのか理解していません。Zend Framework 2のレンダリング/レスポンス戦略の意味と使用方法は?

HTTPヘッダーの受け取りに応じて、3種類の出力(JSON、XML、HTML)を出力するアプリケーションがあります。このケースの戦略をどのように使用できますか?

+1

あなたの質問の範囲をちょっと除いて、必要なのは実際には '' acceptableViewModelSelector() '](http://zf2.readthedocs.org/en/latest/)と呼ばれる' ControllerPlugin'に変換されています。 modules/zend.mvc.plugins.html#zend-mvc-controller-plugins-acceptableviewmodelセレクタ)。これはあなたが必要なものをカバーする必要があります;) – Sam

+0

ちょっとサム!ヒントありがとう!実際に私はそれを['AcceptableViewModelSelector'](http://framework.zend.com/manual/2.1/en/modules/zend.mvc.plugins.html#zend-mvc-controller-plugins-acceptableviewmodelselector)で実装しました。 。しかし、今私はそれに2つの問題があります:1. 'Accept'にいくつかの型が含まれている場合、リクエストは自動的に' PhpRenderer'に転送されます。 2. JSON/XMLの 'script_paths'を設定することはできません(出力のためにデータを準備するために、s [here](http://stackoverflow.com/questions/17275230/how-to-handle-multidimensional-output -with-nested-lists-with-table-gatewa)を参照してください)。 – automatix

+0

あまりにもそれに精通していない、申し訳ありません。複数の受け入れヘッダーは実際に私の地域ではありません:D – Sam

答えて

5

Zend Framework 2の戦略の緩い概念は、実際にはイベント駆動のであるイベントがMVCアプリケーションサイクル中にトリガされたときにアプリケーションが従わなければならない動作です。より実用的な面で

は、戦略は、基本的に通常のイベントリスナ、\Zend\EventManager\AbstractListenerAggregateの具体例であり、そして通常EVENT_RENDEREVENT_RENDER_ERROR\Zend\Mvc\MvcEvent様々なイベントをリッスン。

リスナーは\Zend\EventManager\EventManagerに添付されていますが、前述の\Zend\Mvc\MvcEventを使用して、MVCサイクルのすべての基本リソース(ルーター、リクエスト、レスポンス、アプリケーション自体など)にアクセスすると、リスナーはそのフローを変更します。

ZF2公式ドキュメントで提供されている例では、リスナーは要求の受け入れヘッダーを検査し、レンダラーを選択し、それに応じて応答を変更します。すなわち、404エラーページのレンダリングを処理するためにEVENT_DISPATCHEVENT_DISPATCH_ERRORに耳を傾け\Zend\Mvc\View\Http\RouteNotFoundStrategy

は、これは、しかし少し古いですので、私は、フレームワークが提供するステープル戦略のコードを読んで、いくつかのより良い例を見てお勧めしたいです。

EventManager全体の仕組みを理解することも非常に重要です。それのための公式のドキュメントはかなり良いです、プラスあなたがGoogleの周りにそれについて多くのものがあります。

+5

カップルノート:「戦略」は通常2つのイベントを扱います。最初のものは "レンダリング"、2番目の "応答"です。 「レンダリング」イベントでは、戦略は通常、ビューモデルをイントロスペクションして、ビューモデルをレンダリングできるかどうかを判断します。そうであれば、レンダラーを返します。レンダラーを返す最初の戦略が勝ちます。 "response"イベントは、レンダリングの結果を取得し、レスポンスオブジェクトにプッシュするために使用されます。一般的な使用例は、Content-Typeなどの特定のヘッダーも挿入することです。 – weierophinney

関連する問題