span style="color: #808080; font-style: italic;">// このコントローラでのみ無効にします。
// 初期化時に読み込まれるので、全アクションに影響を及ぼします
// 全体で無効にします
'viewRenderer');
// これも全体で無効にしますが、同時にローカルでも無効にしておく必要があります。
// これは、ローカルの設定を全体に伝播させる方法です。
'noViewRenderer'
initView()、
getViewScript()、
render() および
renderScript()
は、それぞれ
ViewRenderer へのプロキシとなります。
ただしヘルパーブローカ内にこのヘルパーが登録されていない場合や
noViewRenderer フラグが設定されている場合は除きます。
個々のビューのレンダリングを無効にするには、単純に
ViewRenderer の
noRender
フラグを設定することもできます。
span style="color: #808080; font-style: italic;">// このアクションでのみ自動レンダリングを無効にします
ViewRenderer を無効にする場面として考えられるのは、
ビューオブジェクトを必要としない場合や
ビュースクリプト経由でのレンダリングを行わない場合
(たとえば、アクションコントローラを使用して
SOAP や
XML-RPC、
REST
といったウェブサービスプロトコルを扱う場合)
です。
ViewRenderer をグローバルで無効にすることはまずないでしょう。
無効にするとすれば、個々のコントローラやアクション単位で行うことになります。
オブジェクトの初期化
アクションコントローラのコンストラクタをオーバーライドすることもできますが、
お勧めしません。 Zend_Controller_Action::__construct()
は、リクエストオブジェクトやレスポンスオブジェクトを登録するなどの重要な作業を行います。
また、フロントコントローラから渡された起動時引数の処理も行います。
コンストラクタをオーバーライドする場合は、必ずその中で
parent::__construct($request, $response, $invokeArgs)
をコールするようにしましょう。
初期化作業をカスタマイズするには、コンストラクタをオーバーライドするよりも
init() メソッドを使うほうがお勧めです。
これは、 __construct()
の中で最後にコールされます。たとえば、
初期化時にデータベースに接続したいなら次のようにします。
span style="color: #ff0000;">'Pdo_Mysql''host' => 'myhost',
'username' => 'user',
'password' => 'XXXXXXX',
'dbname' => 'website'
));
}
}
ディスパッチ前後のフック
Zend_Controller_Action には、
リクエストされたアクションの前後にコールされるふたつのメソッドがあります。それが
preDispatch() と postDispatch() です。
これらはさまざまな場面で活用できます。
たとえばアクションを実行する前に認証情報や ACL
を調べたり ( preDispatch() の中で
_forward() をコールすると、
そのアクションの処理は飛ばされます)、
作成したコンテンツを ( postDispatch() で)
全サイト共通のテンプレートに配置したりといったことが考えられます。
Note: init() 対 preDispatch() の使用法
前述のセクションでは、
init() メソッドを紹介しましたが、
このセクションでは preDispatch() メソッドを紹介します。
それらの違いは何で、それぞれどのような動作をさせるでしょう?
init() メソッドは、主にコンストラクタを拡張することが目的です。
一般的に、コンストラクタはオブジェクトの状態を単純に設定しなければならなくて、
多くのロジックを実行してはいけません。
これは、コントローラで使用されるリソース(例えばモデル、オブジェクトの構成、その他)を初期化すること、
またはフロントコントローラ、ブートストラップ、
またはレジストリから取得される値をアサインすることを含むかもしれません。
preDispatch() メソッドは、
オブジェクトまたは環境(例えば、ビュー、アクション・ヘルパー、その他)
の状態を設定するために使うこともできます。
しかし、その主な目的は、リクエストされたアクションをディスパッチしなければいけないかどうか
決定することです。
もししないのならば、別のアクションに _forward() するか、
または例外を投げなければなりません。
注意: init() から実行されると、
実は _forward() は正しく動作しません。
それは、2つのメソッドの意図が形になったものです。