最終更新: 2006-12-03 (日) 21:07:31
このページをDeliciousに追加 このページをはてなブックマークに追加 このページをlivedoor クリップに追加 このページをYahoo!ブックマークに追加

Ethna の処理の流れ

目次

メソッドの処理される順序

実行するアクションが決定された後は、 以下のような順序で処理が行われていく。

  1. アクションクラスの authenticate()
  2. アクションクラスの prepare()
  3. アクションクラスの perform()
  4. ビュークラスの preforward()
  5. コントローラクラスの _setDefaultTemplateEngine()
  6. テンプレートの表示

細かく見ればもっと多くのメソッドがあると思うが、 とりあえず自分が使っている範囲でまとめてみた。

遷移先の指定とリダイレクト

遷移先の指定とリダイレクトとの違いをまとめてみた。

遷移先の指定リダイレクト
書式return '***';header('Location: ***');
指定するものビューアクション (URL)
次に実行される処理preforward()authenticate()

ポイントは、遷移先の指定で飛んだ場合には、 perform() などに書かれている処理は実行されないということ。 大抵の場合は遷移先の指定で済ませられるが、 リダイレクトを使った方がすっきりする場合もある。

遷移先の指定で済む場合

アクションフォームに setApp() や set() で改めて値を渡さなくても、 画面表示に必要な情報が揃っている場合はこれでよい。

  • フォーム値が検証に引っかかって再入力させる場合
  • 未ログインなのでログイン画面に飛ばす場合

リダイレクトを使うべき場合

データベースを読み込み直す必要がある場合には、 リダイレクトを使った方が分かりやすい。

  • データベースを更新した後、一覧画面に戻る場合

メソッドの使い分け

各メソッドにどんな処理を書くかは、ある程度自由だが、 自分は以下のようなルールを決めてやっている。

authenticate() に書くべき処理

  • セッションや認証がらみの処理

自分の場合、以下のような感じのクラスを定義して使っている。

class Ethna_UserAction extends Ethna_ActionClass
{
    function authenticate()
    {
        $this->session->start();
        if ($this->user->isLoggedIn() == false) {
            return 'login';
        }
        return null;
    }
}

アクションを実装する際に extends Ethna_UserAction として、 未ログインの場合はログインページに飛ばすようにしている。

prepare() に書くべき処理

  • フォーム値が条件を満たしているかどうかの判定

ただし、データベースにアクセスして初めて判定できるようなものは、 perform() の方にまわす。

perform() に書くべき処理

  • データベースへのアクセス

実際の処理は Ethna_AppManager を継承したクラスに書き、 そのメソッドを perform() から呼ぶ形にする。

  • フォームへの初期値の設定

編集画面の初期値を設定するような場合を考える。 もし設定を preforward() 以降で行うと、 入力エラーで同じ画面に戻ってきた場合に、 ユーザーの入力値が上書きされてしまう。 よって、perform() 内で行うのが適当。

preforward() に書くべき処理

  • セレクトボックス用の配列の定義

例えば、何月かを選んでもらうために、 以下のような配列をアクションフォームに渡すことを考える。

$months = range(1, 12);
$this->af->setApp('months', $months);

もしこれを perform() で行うと、 入力エラーで同じ画面に戻ってきた場合に 選択肢が表示されなくなってしまうので、 このような処理は preforward() で行うべき。

_setDefaultTemplateEngine() に書くべき処理

  • 全てのビューで共通に行いたい処理

自分の場合、 テンプレート中から現在のアクション名を参照できるようにするための処理を、 ここで行っている。


(Counter:1, Today:1, Yesterday:0)
トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   最終更新のRSS