phalconのdispatcher内のイベントについて備忘として残しておきます。
phalconアプリケーション(MVC)の流れ
phalconの処理は超ざっくり書くと、DIコンテナに色々つめこんで、それを引数にPhalcon\Mvc\Applicationクラスをインスタンス化し、 echo $application->handle()->getContent() をコールして出力というフローになります。$application->handle()ではrouterやdispatcherによって内部でレスポンス(Phalcon\Http\Response)が生成されるとともにHTTPヘッダが出力され、戻り値としてResponseオブジェクトが返却され、ResponseオブジェクトのgetContent()で実際のHTMLをecho文で出力しています。
routerではURLやHTTPメソッドに応じたルーティングを行い、実行するコントローラ及びメソッドを決定し、dispatcherでは実際に指定のコントローラをインスタンス化し、メソッドを実行します。
この一連の流れにおいて、たくさんのイベントが発生し、それをEventManagerで補足することでロギング等の共通処理を埋め込むことが出来るのですが、今回はdispatcherのdispatch実行時のイベント発生にフォーカスを当てて見ていきます。
参考URL→Dispatching Controllers
dispatchのイベント発生、メソッドコールの順番
おおまかにこんな感じです。詳細はソースコードを読むのが一番です!- Event/ dispatch:beforeDispatchLoop
- Event/ dispatch:beforeDispatch
- Controllerのインスタンス化
- Event/ dispatch:beforeExecuteRoute
- Controller/ beforeExecuteRoute実行
- Controller/ initializeメソッド実行
- Event/ dispatch:afterInitialize
- Controler/ 指定のメソッド実行
- Event/ dispatch:afterExecuteRoute
- Event/ dispatch:afterDispatch
- Controller/ afterExecuteRoute実行
- forward等を利用して他のメソッドを呼び出した場合は2に戻る(dispatch loop)
- Event/ dispatch:afterDispatchLoop
- Controller内でExceptionが発生→Event: beforeExceptionが発生
- コントローラ(ハンドラ)はあるけどメソッドがみつからない→Event: beforeNotFoundAction
余談
ちなみに、ソースコードを読むとdispatcherクラスのdispatchメソッド内に以下の様な記述がありました。let handler = dependencyInjector->getShared(handlerClass);
あれ、ハンドラーのクラスがDIコンテナに入ってるの?って思ってDIコンテナ側のコードを読んでいたら、Phalcon\Diのgetメソッド呼び出し時に、DIコンテナに明示的に入っていない場合はReflectionClass等を使ってクラスを動的に生成してました。つまり、以下のようにしてrequire等でロードされているクラスのインスタンスを生成することができます。
$hoge = $this->getDI()->get('Hoge'); //Hogeクラスのインスタンス生成
ただし、以下の様な書き方はできません。あくまでもDIコンテナに対して明示的にsetされていないとショートカットは利用できないっぽいです。
$hoge = $this->Hoge;
この投稿はPhalcon Advent Calendar 2015の 20日目の記事です。