[ Zend Framework1 ] アクションヘルパーの登録と実行順序

Pocket

ここでは、Zend Framewrok におけるアクションヘルパーの導入するためのサンプルコードを掲載しています。なお、アクションヘルパー自体については、下記を参照ください。

アクションヘルパーを使用すると、Zend_Controller_Action を継承した任意のアクションコントローラに対して 実行時やその他必要に応じて機能を追加できます。 アクションヘルパーの狙いは、 アクションコントローラに共通機能を追加するために いちいち抽象クラスを継承する手間を省くことにあります。

スポンサーリンク

アクションヘルパークラスの作成

アクションヘルパーは、Zend_Controller_Action_Helper_Abstract クラスを継承して作成します。なお、以下のアクションヘルパーを application/controllers/helper に配置するものとしています。

// path : application/controllers/helper/Sample.php

class Action_Helper_Sample extends Zend_Controller_Action_Helper_Abstract 
{
    /* オーバーライド */
    public function init()
    {
         $this->getResponse()->appendBody("SampleHelper.init()\n");
    }

    /* オーバーライド */
    public function preDispatch()
    {
         $this->getResponse()->appendBody("SampleHelper.preDispatch()\n");
    }

    /* オーバーライド */
    public function postDispatch()
    {
         $this->getResponse()->appendBody("SampleHelper.postDispatch()\n");
    }

    /* Sample ヘルパー独自メソッド */
    public function func()
    {
         $this->getResponse()->appendBody("SampleHelper.func()\n");
    }
}

アクションヘルパーの登録

アクションヘルパーを作成しただけでは、フレームワークから呼び出されません。呼び出されるようにするために、ヘルパーをヘルパーブローカ(Zend_Controller_Action_HelperBroker)に登録します。アクションヘルパーの登録は任意の箇所で可能ですが、呼び出し順序の確認のために、Bootstrap で追加しています。

// path : application/Bootstrap.php

require_once 'controllers/helper/Sample.php';

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initAddActionHelper()
    {
        /* アクションヘルパーの追加 */
        $helper = new Action_Helper_Sample();
        Zend_Controller_Action_HelperBroker::addHelper($helper);
    }
}

アクションヘルパー呼出し順序の確認

次のサンプルコードは、アクションコントローラを以下の通り実装して、アクションコントローラとアクションヘルパーの呼び出し順序を確認すています。

class IndexController extends Zend_Controller_Action
{
    public function init()
    {        
        $this->getResponse()->appendBody("IndexController::init\n");
    }

    public function preDispatch()
    {
        $this->getResponse()->appendBody("IndexController::preDispatch\n");
    }

    public function postDispatch()
    {
        $this->getResponse()->appendBody("IndexController::postDispatch\n");
    }

    public function indexAction()
    {
        // Next アクションを次のアクションとして設定する
        $this->_forward('next');
        
        $this->getResponse()->appendBody("IndexController::indexAction\n");

    }

    public function nextAction()
    {
        /* アクションヘルパー独自メソッドの呼び出し */
        $this->_helper->sample->func();
    
        $this->getResponse()->appendBody("IndexController::nextAction\n");
    }
}

実行結果

SampleHelper.init()
IndexController::init

SampleHelper.preDispatch()
IndexController::preDispatch

IndexController::indexAction

IndexController::postDispatch
SampleHelper.postDispatch()

SampleHelper.init()
IndexController::init

SampleHelper.preDispatch()
IndexController::preDispatch

SampleHelper.func()
IndexController::nextAction

IndexController::postDispatch
SampleHelper.postDispatch()

上記の通り、アクションコントローラを包み込みようにアクションヘルパーが起動されていることがわかります。また、アクションヘルパーの追加・削除は任意の位置で可能であり、リクエスト時にヘルパーブローカ にヘルパーが存在すれば呼び出され、存在しなければ呼び出されません。

 

スポンサーリンク

Pocket

Leave a Reply

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

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>