[ Zend Framework1 ] 自動レンダリングを無効化する(noViewRenderer)

Pocket

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';
    }
}    

 

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *