sfActions::sendMail以降のフロー
Mojavi2を使っているアプリの移行の関係上、チュートリアルであるaskeetを今更やってsymfonyをちまちま触り始めた訳ですが、メール送信部分でActionクラスからいきなり
<?php class userActions extends sfActions { : public function executePasswordRequest() { : $raw_email = $this->sendEmail('mail', 'sendPassword'); : } : }
と来た。「mailモジュールのsendPasswordアクションを呼び出してメールを送信する」というのは分かるけど、裏でどういう動きになってるのか気になって仕方がない。。。
ということで、ざっとソースを追ってみてみました。使用しているバージョンは、symfony 1.0.13です。
- 呼び出しているメソッドは、sfActions::sendMail()
- 中身はsfActions::getController()::getPresentationFor($module, $action, 'sfMail')のみ
- sfActions::getController()で返されるのはsfFrontWebControllerオブジェクト
- ということで、sfFrontWebController::getPresentationFor()を見ると、実際には親(祖先)クラスであるsfController::getPresentationFor()
- sfController::getPresentationFor()メソッド内
- sfController::setRenderMode(sfView::RENDER_VAR)でレンダリングモードを「Viewの結果をそのまま返す」モードに変更(522行目)
- sfController::forward($module, $action)でアクション実行(539行目)
- sfActionStackEntry::getPresentation()でViewの結果を取り出し(559行目)
- 今回の場合は、メールヘッダ+メールボディの文字列
- 値を返す(590行目)
ほうほう。なるほどねぇ。
もうちょっと追ってsfPHPView::render()を見てみると、元々はViewの結果は$retvalに格納されていて、レンダリングモードによって
- sfView::RENDER_NONE:何も出力しない
- sfView::RENDER_CLIENT:レスポンス(HTTPレスポンス)として返す
と振り分けされ、振り分けられなかった-sfView::RENDER_VARの場合は$retvalをそのまま返すようになっています。
と、こんな感じに調べながらやってるので、「1日分1時間とか絶対にあり得ない」非常にスローなペースでぼちぼちやってますw