アクションマッピング設定とエラー制御
アクションマッピングで
Some_Action = OtherAction
の設定があるとき、OtherActionに直接アクセスするとエラーを表示させるようにした。
このエラーはパス探索中に発生するわけだけれども、これをどうやってビューまで持って行こうか悩んだ。
ErrorStackとか使えば割と簡単なんだろうなーというのが頭をかすめつつ、普通にreturn falseを繰り返してコントローラからビューにエラーを通知する。
うーん・・・余計にややこしいのかもしれない・・。処理は単純だけれどエラーの種類を判別できない。現状ではフレームワーク設定ファイルのエラーとアクションマッピングのエラーを区別できない。
Linuxカーネルでのエラーの扱いはというと・・・例えば include/asm-generic/errno-base.h でdefineされている。
カーネル全体で共通の定数というわけだ。
PHPでもdefine()かstatic constでいいような気がしてきた・・。
まぁパス探索中のエラーかフレームワーク設定のエラーかアプリのエラーかを区別したいのは開発中だと思うので、普通にtrigger_error()でもいいかな。
ユーザ視点ではエラーじゃなくてただのnot foundだし。
で、仕組みはと言うと
AnyApp_AnyContent = AnyComponent
という設定ファイルがあるとき、AnyApp_AnyContent_Login アクションに対する動作が
- laiz.ini
- AnyApp/laiz.ini
- AnyComponent/laiz.ini
- AnyComponent/Login.ini
の順に設定ファイルが読み込まれ、AnyComponent_Login アクションが指定された場合と同じアクションクラスが起動する。単純にAnyComponent_Login アクションを指定した場合との違いは、AnyApp/laiz.ini が読み込まれること。これによって、認証が必要な設定にしているディレクトリ以下に AnyComponent を持ってくるなど構成の自由度が上がり、それでいてアクションクラス名が複雑にならない。
ブラウザから直接 AnyComponent アクションを指定すると 404 not found を返す。
弊害は、この設定を忘れているとハマる可能性があるということくらいかな。そのためにデバッグフラグをオンにするとtrigger_error()を発生させるようにした。
PHPはこれでいいとして、テンプレート名に関してはますます分かり難くなったわけだが・・。
[view] error = LoginError ; ログインエラー時のテンプレート success = TopPage ; ログイン成功時に表示するトップページ
こんなコメントを書いたらそれを抽出して自動で羅列するような・・・うーん難しそうだ。