ZendMvcMvcEvent は ZendEventManagerEvent を継承し、ZendMvcApplication::bootstrap() が実行されるときにトリガーされます。コントローラーが ZendMvcInjectApplicationEventInterface を実装している場合、MvcEvent がこれらのコントローラーに挿入されます。
MvcEvent は、次のオブジェクトのゲッターとルールを追加します: Application、Request、Response、Router、RouterMatch、Result (通常はコントローラーをディスパッチした結果)、ViewModel (通常はビュー モデルのレイアウトを表示)。アプリケーション、リクエスト、レスポンス、ルーター、およびビューモデルはすべて、ブートストラップ イベント プロセス中に挿入されます。次のルート イベントは RouteMatch オブジェクトに挿入され、ルーティング結果がカプセル化されます。 RouteMatch オブジェクトは MVC 全体で使用されるため、通常、Route、Request、および Response オブジェクトは RouteMatch を通じて取得されます。
MvcEvent は次のメソッドも定義します:
イベントがトリガーされる順序:
名前 | 定数 | 説明 |
ブートストラップ | MvcEvent::EVENT_ブートストラップ | ViewManagerを作成してアプリケーションを起動します |
ルート | MvcEvent::EVENT_ROUTE | ルーティング (またはルーティング関連のアクション) を実行します |
派遣 | MvcEvent::EVENT_DISPATCH | 対応するコントローラー/動作への一致したルートのスケジュール |
発送エラー | MvcEvent::EVENT_DISPATCH_ERROR | スケジュールプロセス中にエラーが発生したときにトリガーされます |
レンダリング | MvcEvent::EVENT_RENDER | データを準備し、レンダリングタスクをビューレイヤーに委任します |
レンダリングエラー | MvcEvent::EVENT_RENDER_ERROR | レンダリングプロセスでエラーが発生したときにトリガーされます |
終了 | MvcEvent::EVENT_FINISH | すべてが完了すると、このイベントは対応するタスクをトリガーします |
詳しい紹介:
MvcEvent::EVENT_BOOTSTRAP("ブートストラップ")
Listener: ZendMvcViewHttpViewManager、onBootstrap メソッドが呼び出されます。
機能: ビュー層を準備します (つまり、ZendMvcViewHttpViewManager をインスタンス化します)。
トリガーメソッド: ZendMvcApplication bootstrap() メソッド。
MvcEvent::EVENT_ROUTE("ルート")
リスナー 1: ZendMvcModuleRouteListener::onRoute
機能: 主にルートマッチングに含まれるパラメータキーが MODULE_NAMESPACE 定数と一致しないようにするために、モジュール名前空間をコントローラー名の前に追加するかどうかを決定します
Listener 2: ZendMvcRouteListener::onRoute ルートが一致しない場合、MvcEvent::EVENT_DISPATCH_ERROR がトリガーされます。
機能: ルーターへのリクエストの照合を試み、RouteMatch オブジェクトを返します。
トリガーメソッド: ZendMvcApplication::run
機能: ルーティングプロセス中にエラーが発生した場合、短いループコールバックを使用してイベントの継続的な伝播が停止されます。
MvcEvent::EVENT_DISPATCH("ディスパッチ")
リスナーは 2 つのカテゴリに分類されます。1 つはコンソール環境に限定され、もう 1 つは HTTP 環境に限定され、すべての環境に適用できるリスナーがあります。この記事では、CONSOLE 環境については紹介しません。コンソール環境については、公式ドキュメントを確認してください。
クラス ZendMvcViewHttpCreateViewModelListener には、このイベントのリスナーとして 2 つの関数があります。
1. createViewModelFromArray (コントローラーアクションが連想配列を返す場合、このリスナーは配列を ViewModel オブジェクトに変換します。2. createViewModelFromNull (コントローラーが null 値を返した場合、このメソッドはそれを ViewModel オブジェクトに変換します)
クラス ZendMvcViewHttpRouteNotFoundStrategy::prepareNotFoundViewModel は 404ViewModel を作成して返します
クラス ZendMvcViewHttpInjectTemplateListener::injectTemplate は、View Model にテンプレートを挿入します。テンプレート名は、ルート (またはコントローラー内のアクション) と一致するコントローラー名から継承されます
クラス ZendMvcViewHttpInjectViewModelListener::injectViewModel ViewModel を挿入し、MvcEvent オブジェクトに追加します。 2 つの状況があります: a) ビュー モデルを含む子オブジェクトとして追加されます。 b) 結果を終了できる場合は、デフォルトの状況を置き換えます
クラス ZendMvcMiddlewareListener::onDispatch は MvcEvent::EVENT_DISPATCH_ERROR をトリガーし、サービス マネージャーから一致する PSR-7 ミドルウェアをロードしてディスパッチします。
クラス ZendMvcDispatchListener::onDispatch は MvcEvent::EVENT_DISPATCH_ERROR をトリガーし、上記と同じ効果があります。
クラス ZendMvcControllerAbstractController::onDispatch このメソッドは抽象クラスです。
トリガー方法:
ZendMvcApplication::run は、短絡コールバックを使用してイベントの伝播を終了します。 (ルーティング時にエラーが発生した場合)
ZendMvcControllerAbstractController::dispatch リスナーが Response オブジェクトを返すと、イベントの伝播が終了します。 AbstractController がこのイベントをリッスンするたびに、トリガーされたときに onDispatch メソッドが呼び出されます。
MvcEvent::EVENT_RENDER("レンダリング") リスナー:
ZendMvcViewConsoleDefaultRenderingStrategy::render はビューのレンダリングに使用されます
ZendMvcViewHttpDefaultRenderingStrategy::render もビューをレンダリングします。上記の環境との違いに注意してください
トリガー方法:
ZendMvcApplication::competeRequest このイベントは、MvcEvent::FINISH がトリガーされる前にトリガーされます。
MvcEvent::EVENT_FINISH("終了") リスナー:
ZendMvcSendResponseListener::sendResponse は、SendResponseEvent をトリガーして応答を準備します。
トリガー方法:
ZendMvcApplication::run MvcEvent::ROUTE または MvcEvent::DISPATCH イベントが正しい ResponseInterface を返すと、このイベントがトリガーされます
ZendMvcApplication::completeRequest は、MvcEvent::RENDER の後にトリガーされます (つまり、この時点でビューがレンダリングされています)。
SendResponseイベントについて
ZendMvcResponseSenderSendResponseEvent は次のメソッドを定義します:
setResponse($response)
getResponse()
setContentSent()
コンテンツ送信()
setHeadersSent()
ヘッダーSent()
これらのメソッドは、応答ヘッダーと応答コンテンツを設定するために使用されます。
リスナー:
ZendMvcSendResponseListenerPhpEnvironmentResponseSender::__invoke は環境 HTTP を使用します
ZendMvcSendResponseListenerConsoleResponseSender::__invoke は環境コンソールを使用します。
ZendMvcSendResponseListenerSimpleStreamResponseSender::__invoke
MvcEvent::このイベントは、FINISH イベントがトリガーされた後に実行されます