7.6. プラグイン
前のページ | 第7章 Zend_Controller | 次のページ

## 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;

前のページ | 上に戻る | 次のページ
7.5. アクションコントローラ | ホーム | 7.7. モジュラーディレクトリ構造の規約の使用