ZendFramework では、デフォルトのビューとして Zend_Controller_Action_Helper_ViewRenderer が登録されます。登録はフロントコントローラ(Zend_Controller_Front)の dispatch メソッドで行われます。なお、ビューはアクションヘルパーとして登録されるため、すべてのアクションに対して実行されます。
ここでは、このビュー(自動レンダリング)を無効化するサンプルを掲載しています。
スポンサーリンク
ビューの無効化
フロントコントローラ(Zend_Controller_Front)はデフォルトで ViewRenderer アクションヘルパーを登録します。アクションヘルパーの登録は、Zend_Controller_Front::dispatch メソッドで行われるため、その前に登録しないよう制御するサンプルは次の通りです
bootstrap でビューの登録を行わないよう制御する
初期化処理(bootstrap)については次のリンクで詳細を確認できます。
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initNoViewRenderer()
{
// 自動レンダリングの無効化
$front = Zend_Controller_Front::getInstance();
$front->setParam('noViewRenderer', true);
}
}
ただ、上記の方法では、すべてのアクションに対してビューが無効となりますので、一部のアクションのみビューを無効化したい場合などには向かない方法です。
もう一方の方法としては、viewRenderer という名前のビューを bootstrap で先に登録する方法があります。 なお、この方法は smarty などのテンプレートエンジンをデフォルトのビューの代用として使用する場合などに利用できます。
一部のアクションのみビューを使用しない
すべてのアクションに対してビューを無効(アクションヘルパー未登録)とするのではなく、アクションごとにビューの有効・無効を制御するサンプルは次の通りです。index コントローラの index アクションのビュー実行を無効化しています。
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
/*
* フロントコントローラを取得してパラメータを設定する場合
*/
$front = Zend_Controller_Front::getInstance();
$front->setParam('noViewRenderer', true);
/*
* ビューヘルパーを無効化する
* setNoRender または setNeverRender メソッドを呼び出す
*/
$this->_helper->getHelper('ViewRenderer')->setNoRender(true);
//$this->_helper->getHelper('ViewRenderer')->setNeverRender(true);
/*
* 思い切って アクションヘルパーの登録を解除する場合
*/
if (Zend_Controller_Action_HelperBroker::hasHelper('ViewRenderer')) {
Zend_Controller_Action_HelperBroker::removeHelper('ViewRenderer');
}
}
}
メモ
ビューレンダ アクションヘルパーに関しては、上記の他 _redirect メソッドによって、リダイレクトする場合もビューは実行されません。例えば、次の例にあるように index コントローラの index アクションに対するビューのレンダリングは行われません。
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
// next アクションへリダイレクト
$this->_redirect('http://localhost/index/next');
}
public function nextAction()
{
echo 'index/next action';
}
}