LoginSignup
27
31

More than 5 years have passed since last update.

Phalcon アクション周りのイベントとかメモ

Last updated at Posted at 2014-09-16

ルーティングからアクションまでにはさめる処理メモ

下記のテーブルの上から順に実行される.

種類 名前とか 実行回数とか
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

27
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
31