実行するアクションが決定された後は、 以下のような順序で処理が行われていく。
細かく見ればもっと多くのメソッドがあると思うが、 とりあえず自分が使っている範囲でまとめてみた。
遷移先の指定とリダイレクトとの違いをまとめてみた。
遷移先の指定 | リダイレクト | |
書式 | return '***'; | header('Location: ***'); |
指定するもの | ビュー | アクション (URL) |
次に実行される処理 | preforward() | authenticate() |
ポイントは、遷移先の指定で飛んだ場合には、 perform() などに書かれている処理は実行されないということ。 大抵の場合は遷移先の指定で済ませられるが、 リダイレクトを使った方がすっきりする場合もある。
アクションフォームに setApp() や set() で改めて値を渡さなくても、 画面表示に必要な情報が揃っている場合はこれでよい。
データベースを読み込み直す必要がある場合には、 リダイレクトを使った方が分かりやすい。
各メソッドにどんな処理を書くかは、ある程度自由だが、 自分は以下のようなルールを決めてやっている。
自分の場合、以下のような感じのクラスを定義して使っている。
class Ethna_UserAction extends Ethna_ActionClass { function authenticate() { $this->session->start(); if ($this->user->isLoggedIn() == false) { return 'login'; } return null; } }
アクションを実装する際に extends Ethna_UserAction として、 未ログインの場合はログインページに飛ばすようにしている。
ただし、データベースにアクセスして初めて判定できるようなものは、 perform() の方にまわす。
実際の処理は Ethna_AppManager を継承したクラスに書き、 そのメソッドを perform() から呼ぶ形にする。
編集画面の初期値を設定するような場合を考える。 もし設定を preforward() 以降で行うと、 入力エラーで同じ画面に戻ってきた場合に、 ユーザーの入力値が上書きされてしまう。 よって、perform() 内で行うのが適当。
例えば、何月かを選んでもらうために、 以下のような配列をアクションフォームに渡すことを考える。
$months = range(1, 12); $this->af->setApp('months', $months);
もしこれを perform() で行うと、 入力エラーで同じ画面に戻ってきた場合に 選択肢が表示されなくなってしまうので、 このような処理は preforward() で行うべき。
自分の場合、 テンプレート中から現在のアクション名を参照できるようにするための処理を、 ここで行っている。