とりあえず symfony1.1 の処理をざっくり追う
ProjectConfiguration::setup() で config/settings.yml で定義した値が読み込めなくて、じゃあどうすればいいんじゃいと思ったのがきっかけで symfony1.1 の処理をざっくり追ってみた。
ざっくり書いたので間違っているかもしれませんが、もしなにかの役に立てば。
0) フロントコントローラ(web/***.php) を読み込み
- ProjectConfiguration::getApplicationConfiguration() でアプリケーションのコンフィグを取得したりする
- ちなみに ProjectConfiguration::setup() はこの奥深くで sfApplicationConfiguration のインスタンスを生成する際に呼ばれていた
1) sfContextのインスタンスを生成(sfContext::createInstance())
1-1) 初期化処理(sfContext::initialize())
- lib/config/config/factories.yml で定義されたファクトリーたちを取得
- ロギング(?)
- その他。ファクトリー以外はあまり重要じゃないかも?
2) 1) で生成したインスタンスのディスパッチをおこなう(sfContext::dispatch())
2-1) 1-1-1) で取得したファクトリーから生成されたコントローラのディスパッチをおこなう(sfFrontWebController::dispatch())
リクエストの取得
2-2) 2-1-2), 2-1-3) で取得したモジュール名とアクション名を引数に取り、スーパークラスの sfWebController のスーパークラスの sfController::forward() をコール
- モジュール名、アクション名に含まれる不適切な文字の除去
- スタックしまくっている場合は例外を投げる
- モジュールの generator コンフィグを取得(modules/***/config/generator.yml)
- アクションの存在チェック。存在しない場合は例外を投げる
- アクションのインスタンスを取得し、スタックリストに追加
- モジュールの設定を読み込む
- 直接呼べないアクション(mod_***_is_internal が 1 である)を直接読んだ(スタックが1)場合は例外
- モジュールが無効な場合はエラーページに遷移(エラーページがない場合は例外を投げる)
- モジュールのコンフィグを読み込み
- フィルタチェーンを生成。
2-3) 2-2-10) で生成したフィルタチェーンを実行
登録済みのフィルタの execute() をすべて実行する。ここでは、デフォルトで必ず実行されるフィルタについて述べる。
- sfRenderingFilter
- プレフィルタ
- (なし)
- ポストフィルタ
- レスポンスオブジェクトを取得する
- レスポンスオブジェクトのsend()メソッドを実行し、ヘッダとコンテンツを出力
- プレフィルタ
- sfBasicSecurityFilter(アクションの isSecure() が true を返す場合のみ実行)
- プレフィルタ
- login action, login module, secure action, secure module の場合は何もせず次のフィルタへ(なにこれ?)
- ログイン済みユーザ情報が取得できない場合はログインアクションへ
- ユーザが Credential である場合はセキュアアクションへ(?)
- ポストフィルタ
- (なし)
- プレフィルタ
- sfCommonFilter
- プレフィルタ
- (なし)
- ポストフィルタ
- テンプレートのヘッダの直前に JavaScript と CSS を読み込むためのタグを挿入する
- プレフィルタ
- sfExecutionFilter
- プレフィルタ
- アクションのインスタンスを取得する
- アクションを実行する
- Viewを実行する
- ポストフィルタ
- (なし)
- プレフィルタ
てな感じです。
「symfony のフィルタっておもしれー、よくできてるぜ」とか思っていたら、アクションの実行なんていう超重要な役割まで担っていたんですね。そりゃあしっかりしているはずだ。