コントローラにはプラグイン機構が組み込まれており、 コントローラの処理中にイベントが発生した際にユーザのコードをコールすることができます。 フロントコントローラは、プラグインブローカにユーザのプラグインを登録します。 そして、イベントメソッドがコールされた際に、 フロントコントローラに登録されているプラグインをプラグインブローカが実行します。
イベントメソッドは、抽象クラス
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
がディスパッチループを抜ける前にコールされます。
プラグインクラスを書くには、単に抽象クラス
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() メソッドを使用します。
プラグインクラスを登録するには、ディスパッチの前に
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;