ルーティングからアクションまでにはさめる処理メモ
下記のテーブルの上から順に実行される.
種類 | 名前とか | 実行回数とか |
---|---|---|
Func | Route#beforeMatch() | 一致するまでそれぞれ一回 |
Func | Route#convert() | マッチしたあと設定されている分だけ |
Event | dispatch:beforeDispatchLoop | 一回のリクエストで一回だけ実行 |
Event | dispatch:beforeDispatch | ディスパッチループが回るごとに一回でアクションがなくても実行 |
Event | dispatch:beforeExecuteRoute | ディスパッチループが回るごとに一回でアクションがあったら実行 |
Method | Controller#beforeExecuteRoute() | ディスパッチループが回るごとに一回でコントローラで定義できる前処理 |
Method | Controller#initialize() | 最初に対象コントローラがインスタンス化されたときだけ |
Method | Controller#xxxAction() | <- メイン |
Event | dispatch:afterExecuteRoute | ディスパッチループが回るごとに一回 |
Event | dispatch:afterDispatch | ディスパッチループが回るごとに一回 |
Method | Controller#afterExecuteRoute() | ディスパッチループが回るごとに一回 afterExecuteRoute の直前かと思ってたけど違う罠 |
Event | dispatch:afterDispatchLoop | 一回のリクエストで一回だけ実行 |
上記のなかだと initialize() の動きが若干トリッキーなのでわかってないとちょっとハマるかもしれない.例えば ControllerBase で initialize() を実装してそれぞれのコントローラで継承してる場合, forward すると複数回 initialize() が実行されて変なことになる可能性もある.リクエスト一回で一回しか実行したくない場合は dispatch:beforeDispatchLoop で処理するのが適切そう.
あるいは各アクションで一回処理してほしい場合は dispatch:beforeExecuteRoutee() か Controller#beforeExecuteRoute() に書くのが適切そう.コントローラに依存しないものは前者で依存するものは後者で処理するのがよさそう.
また,指定されたアクションがなければ dispatch:beforeDispatch と dispatch:beforeExecuteRoute の間で dispatch:beforeNotFoundAction イベントが発行される.404 ページなどはここからいけるかもだけど正直 Router には設定されてるけど Action がないというのはそんなに考えられれない気がするので開発中に使うことが多そう?
あと 詳しくみてないが例外が投げられると dispatch:beforeException を通る.これはディスパッチループの中なのでそのままエラーページなどに forward/redirect などができるかもしれない.例外投げてからそのままビューに復帰できるかは確認してないのでバリデーションを例外として投げてエラーメッセージをそのままビューで表示するといったような処理ができるかどうかわからん.
404 などのエラーページについて
おまけ程度に簡単に思いつく実装を並べる.
- Phalcon\Mvc\Router#notFound() でパスに対応しないものとして扱ってエラー用のアクションに流す
- dispatch:beforeNotFoundAction イベントを拾ってエラーアクションやエラーページに redirect/forward する
- ディスパッチャ内で EXCEPTION_HANDLER_NOT_FOUND や EXCEPTION_ACTION_NOT_FOUND のような例外が Phalcon から投げられるかあるいはユーザが例外を投げて,それを拾ってエラーアクションやエラーページに forward/redirect する 参考
(追記)
\Phalcon\Mvc\Router(true) のようにデフォルトのルーティングが定義されている場合は $router の notFound() まで行かずに おそらくデフォルトルートにマッチしてしまう( example.com/hoge とかだと controller => hoge, action => index )ので beforeException まで行ってしまうので 三番目の方法しか使えない.
参考文献
php - How to setup a 404 page in Phalcon - Stack Overflow
https://stackoverflow.com/questions/14071261/how-to-setup-a-404-page-in-phalcon