7.6. プラグイン

7.6.1. 導入

コントローラにはプラグイン機構が組み込まれており、 コントローラの処理中にイベントが発生した際にユーザのコードをコールすることができます。 フロントコントローラは、プラグインブローカにユーザのプラグインを登録します。 そして、イベントメソッドがコールされた際に、 フロントコントローラに登録されているプラグインをプラグインブローカが実行します。

イベントメソッドは、抽象クラス Zend_Controller_Plugin_Abstract で定義されています。 ユーザが作成するプラグインクラスは、これを継承させます。

  • routeStartup() は、Zend_Controller_Front がルートに対するリクエストの評価を始める前にコールされます。

  • routeShutdown() は、Zend_Controller_Router が終了した後、Zend_Controller_Front がルータから抜ける際にコールされます。

  • dispatchLoopStartup() は、Zend_Controller_Front がディスパッチループに入る前にコールされます。

  • preDispatch() は、アクションが Zend_Controller_Dispatcher でディスパッチされる前にコールされます。 このコールバックは、プロキシやフィルタ的な動作をさせることができます。 リクエストの内容を変更してディスパッチフラグをリセット (Zend_Controller_Request_Abstract::setDispatched(false) を使用します) することで、現在のアクションをスキップさせることができます。

  • postDispatch() は、アクションが Zend_Controller_Dispatcher でディスパッチされた後にコールされます。 このコールバックは、プロキシやフィルタ的な動作をさせることができます。 リクエストの内容を変更してディスパッチフラグをリセット (Zend_Controller_Request_Abstract::setDispatched(false) を使用します) することで、新しいディスパッチ先アクションを指定することができます。

  • dispatchLoopShutdown() は、Zend_Controller_Front がディスパッチループを抜ける前にコールされます。

7.6.2. プラグインの書き方

プラグインクラスを書くには、単に抽象クラス Zend_Controller_Plugin_Abstract をインクルードしてそれを継承するだけです。

<?php
require_once 'Zend/Controller/Plugin/Abstract.php';

class MyPlugin extends Zend_Controller_Plugin_Abstract
{
    // ...
}

Zend_Controller_Plugin_Abstract には抽象メソッドはありません。 つまり、上に示したイベントメソッドを、 プラグインクラスでかならず実装しなければならないわけではありません。 プラグインの作者が、必要なものだけを選んで実装することができます。

Zend_Controller_Plugin_Abstract では、 リクエストオブジェクトやレスポンスオブジェクトをプラグインから操作することができます。 それぞれ、getRequest() メソッドおよび getResponse() メソッドを使用します。

7.6.3. プラグインの使用法

プラグインクラスを登録するには、ディスパッチの前に Zend_Controller_Front::registerPlugin() をコールします。 次の例は、コントローラチェインでプラグインを使用する方法を示すものです。

<?php
require_once 'Zend/Controller/Front.php';
require_once 'Zend/Controller/Router.php';
require_once 'Zend/Controller/Plugin/Abstract.php';

class MyPlugin extends Zend_Controller_Plugin_Abstract
{
    public function routeStartup()
    {
        $this->getResponse()->appendBody('<p>routeStartup() がコールされました</p>');
    }

    public function routeShutdown($request)
    {
        $this->getResponse()->appendBody('<p>routeShutdown() がコールされました</p>');
    }

    public function dispatchLoopStartup($request)
    {
        $this->getResponse()->appendBody('<p>dispatchLoopStartup() がコールされました</p>');
    }

    public function preDispatch($request)
    {
        $this->getResponse()->appendBody('<p>preDispatch() がコールされました</p>');
    }

    public function postDispatch($request)
    {
        $this->getResponse()->appendBody('<p>postDispatch() がコールされました</p>');
    }

    public function dispatchLoopShutdown()
    {
        $this->getResponse()->appendBody('<p>dispatchLoopShutdown() がコールされました</p>');
    }
}

$controller = Zend_Controller_Front::getInstance();
$controller->setControllerDirectory('/path/to/controllers')
           ->setRouter(new Zend_Controller_Router())
           ->registerPlugin(new MyPlugin());
$response = $controller->dispatch();

echo $response;