Actionフィルタの変更
Mapleを使ってアンケートフォームのようなアプリを作った場合にかならずぶち当たる問題として以下のようなものがあります。
- フォームの画面で職業や都道府県のプルダウンを表示する準備をフォームのアクションで行っている
- 確認画面のアクションでのバリデーションでひっかった場合にフォームの画面の上にエラー表示をしたい
- 確認画面のバリデーションエラー時のテンプレートをフォームのHTMLにする
- 確認画面のアクションには職業や都道府県のプルダウンの準備するコードがないので、職業・都道府県が表示されない
今までActionChainを使う方法やプルダウンを準備するロジックをテンプレートから呼ぶとか別途フィルターで後処理をするとかといった「回避策」的解決を勧めることが多かったが、もっと素直にActionフィルターを以下のように変更するというのはどうでしょう?
- 現在Actionフィルターではexecuteメソッドしか呼び出してないが、Actionにbefore/afterというメソッドがあればそれをexecuteメソッドの前後で呼び出す。
- executeメソッドはエラーが発生したときには呼び出されない(これがバリデーションエラー時にプルダウンが準備できない原因)が、afterメソッドは無条件に呼ばれるのでそこでプルダウンの準備ができる。
beforeメソッドの使い道は?という点だが、Validatorで切り出すほどでもない特殊なエラーチェックをここでして、エラーの場合はexecuteをすっ飛ばすという使い方もできるかなと(Ethnaのprepareっぽい)。beforeメソッドの発動ポイントはリクエストパラメータ・コンポーネントのインジェクション処理とexecute実行の間かなぁと。
Mapleを初めて使った人がかならずはまるポイントなので、この修正は入れてもいいかなぁと思うのですが、どうでしょう?
#なにげにみんな既にActionに手を入れてこうしてるという話もあるような気も・・・