技術日記
ようやくViewの初期化手順が分かったEdit

標準設定状態でのView周りの初期化処理の流れがようやく理解できた。

  • Zend_Controller_Front::__construct()で、viewRendererがZend_Controller_Action_HelperBroker::addHelper()される
  • Zend_Controller_Front::dispatch()内で、Zend_Controller_Dispatcher::dispatch()される
  • Zend_Controller_Action::__construct()が実行され、その中でZend_Controller_Action_HelperBroker::__construct()が実行される
  • Zend_Controller_Action_HelperBroker::__construct()内で、viewRenderer::init()が実行される
  • viewRenderer::init()内で、viewRenderer::initView()が実行される
  • 初回のviewRenderer::initView()でのみ、Zend_Viewオブジェクトが生成され、2回目以降は作成済みのZend_Viewオブジェクトを使い回す
  • viewRenderer::initView()内では、Zend_Viewオブジェクトの生成以外のViewの設定(現在のリクエストに対応したパスの解決など)は、毎回(_forward()されるたびに)行われる
  • viewRenderer::initView()内で、Zend_Controller_Action::$viewにviewRendererの持つViewオブジェクトをセットする
  • これで、アクションコントローラ内のメソッドでは、$this->viewで、viewRendererと共通のViewオブジェクトを利用することができる

なのね。てっきりZend_Controller_Action::initView()の方がメインだと思って、それが呼ばれる場所を探していたよ。Zend_Controller_Action::initView()の方は、viewRendererがない場合用のZend_View生成場所なのね。

ただ、viewRendererの有無を意識したくなければ、アクションコントローラ内では直接$this->viewを使わず、$this->initView()経由でViewオブジェクトを扱うようにした方がいいのかな?

あと、こういう仕組みならば、viewRendererを利用している場合に限り、カスタムView(たとえばZend_View_Smarty)をあらかじめviewRenderer::setView()しておくことで、アクションコントローラ内で$this->viewとか$this->initView()とかして使うことができそうだ。viewRendererを使わない場合は、Zend_Controller_Action::initView()とかを書き直したアクションコントローラを使う必要が出てくるんだろう。

Published At2007-06-05 00:00Updated At2019-12-30 23:52