Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

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です。

  1. 呼び出しているメソッドは、sfActions::sendMail()
    • 中身はsfActions::getController()::getPresentationFor($module, $action, 'sfMail')のみ
    • sfActions::getController()で返されるのはsfFrontWebControllerオブジェクト
    • ということで、sfFrontWebController::getPresentationFor()を見ると、実際には親(祖先)クラスであるsfController::getPresentationFor()
  2. 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