1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 20765 -->
4 <sect1 id="zend.controller.plugins" xmlns:xi="http://www.w3.org/2001/XInclude">
7 <sect2 id="zend.controller.plugins.introduction">
11 コントローラにはプラグイン機構が組み込まれており、
12 コントローラの処理中にイベントが発生した際にユーザのコードをコールできます。
13 フロントコントローラは、プラグインブローカにユーザのプラグインを登録します。
14 そして、イベントメソッドがコールされた際に、
15 フロントコントローラに登録されているプラグインをプラグインブローカが実行します。
20 <classname>Zend_Controller_Plugin_Abstract</classname> で定義されています。
21 ユーザが作成するプラグインクラスは、これを継承させます。
27 <methodname>routeStartup()</methodname> は、<classname>Zend_Controller_Front</classname>
28 が <link linkend="zend.controller.router">ルータ</link>
29 をコールしてルートに対するリクエストの評価を始める前にコールされます。
35 <methodname>routeShutdown()</methodname> は、
36 <link linkend="zend.controller.router">ルータ</link>
37 がリクエストのルーティングを終了した後にコールされます。
43 <methodname>dispatchLoopStartup()</methodname> は、<classname>Zend_Controller_Front</classname>
44 がディスパッチループに入る前にコールされます。
50 <methodname>preDispatch()</methodname> は、アクションが
51 <link linkend="zend.controller.dispatcher">ディスパッチャ</link> でディスパッチされる前にコールされます。
52 このコールバックは、プロキシやフィルタ的な動作をさせることができます。
53 リクエストの内容を変更してディスパッチフラグをリセット
54 (<methodname>Zend_Controller_Request_Abstract::setDispatched(false)</methodname> を使用します)
55 することで、現在のアクションをスキップさせたり置き換えたりできます。
61 <methodname>postDispatch()</methodname> は、アクションが <link linkend="zend.controller.dispatcher">ディスパッチャ</link>
63 このコールバックは、プロキシやフィルタ的な動作をさせることができます。
64 リクエストの内容を変更してディスパッチフラグをリセット
65 (<methodname>Zend_Controller_Request_Abstract::setDispatched(false)</methodname> を使用します)
66 することで、新しいディスパッチ先アクションを指定できます。
72 <methodname>dispatchLoopShutdown()</methodname> は、<classname>Zend_Controller_Front</classname>
73 がディスパッチループを抜けた後にコールされます。
79 <sect2 id="zend.controller.plugins.writing">
80 <title>プラグインの書き方</title>
84 <classname>Zend_Controller_Plugin_Abstract</classname>
88 <programlisting language="php"><![CDATA[
89 class MyPlugin extends Zend_Controller_Plugin_Abstract
96 <classname>Zend_Controller_Plugin_Abstract</classname> には抽象メソッドはありません。
98 プラグインクラスでかならず実装しなければならないわけではありません。
99 プラグインの作者が、必要なものだけを選んで実装できます。
103 <classname>Zend_Controller_Plugin_Abstract</classname> では、
104 リクエストオブジェクトやレスポンスオブジェクトをプラグインから操作できます。
105 それぞれ、<methodname>getRequest()</methodname> メソッドおよび
106 <methodname>getResponse()</methodname> メソッドを使用します。
110 <sect2 id="zend.controller.plugins.using">
111 <title>プラグインの使用法</title>
114 <methodname>Zend_Controller_Front::registerPlugin()</methodname> をコールします。
116 次の例は、コントローラチェインでプラグインを使用する方法を示すものです。
119 <programlisting language="php"><![CDATA[
120 class MyPlugin extends Zend_Controller_Plugin_Abstract
122 public function routeStartup(Zend_Controller_Request_Abstract $request)
125 ->appendBody("<p>routeStartup() がコールされました</p>\n");
128 public function routeShutdown(Zend_Controller_Request_Abstract $request)
131 ->appendBody("<p>routeShutdown() がコールされました</p>\n");
134 public function dispatchLoopStartup(
135 Zend_Controller_Request_Abstract $request)
138 ->appendBody("<p>dispatchLoopStartup() がコールされました</p>\n");
141 public function preDispatch(Zend_Controller_Request_Abstract $request)
144 ->appendBody("<p>preDispatch() がコールされました</p>\n");
147 public function postDispatch(Zend_Controller_Request_Abstract $request)
150 ->appendBody("<p>postDispatch() がコールされました</p>\n");
153 public function dispatchLoopShutdown()
156 ->appendBody("<p>dispatchLoopShutdown() がコールされました</p>\n");
160 $front = Zend_Controller_Front::getInstance();
161 $front->setControllerDirectory('/path/to/controllers')
162 ->setRouter(new Zend_Controller_Router_Rewrite())
163 ->registerPlugin(new MyPlugin());
168 他に何かの出力を行うアクションがなく、ひとつのアクションのみがコールされたとしましょう。
169 上のプラグインは、次のような出力を行います。
172 <programlisting language="php"><![CDATA[
173 <p>routeStartup() がコールされました</p>
174 <p>routeShutdown() がコールされました</p>
175 <p>dispatchLoopStartup() がコールされました</p>
176 <p>preDispatch() がコールされました</p>
177 <p>postDispatch() がコールされました</p>
178 <p>dispatchLoopShutdown() がコールされました</p>
183 プラグインは、フロントコントローラの実行時ならいつでも登録できます。
184 しかし、プラグインがイベントメソッドを登録しようとしているイベントが終わった後では、
190 <sect2 id="zend.controller.plugins.manipulating">
191 <title>プラグインの取得と操作</title>
194 時には、プラグインの登録を解除したりプラグインの情報を取得したいこともあるでしょう。
195 フロントコントローラには、そのような場合のために次のメソッドが用意されています。
201 <methodname>getPlugin($class)</methodname>
202 は、指定したクラス名のプラグインを取得します。
203 一致するプラグインがない場合は <constant>FALSE</constant> を返します。
204 同じクラス名のプラグインが複数登録されている場合は、結果を配列で返します。
210 <methodname>getPlugins()</methodname> は、プラグインスタック全体を取得します。
216 <methodname>unregisterPlugin($plugin)</methodname>
217 は、プラグインをスタックから登録解除します。
218 パラメータには、プラグインオブジェクト自体かそのクラス名を渡します。
219 クラス名を渡すと、一致するプラグインがすべて削除されます。
225 <sect2 id="zend.controller.plugins.standard">
226 <title>標準の配布パッケージに含まれるプラグイン</title>
229 Zend Framework の配布パッケージには、
230 エラー処理用のプラグインが標準で組み込まれています。
233 <xi:include href="Zend_Controller-Plugins-ActionStack.xml" />
234 <xi:include href="Zend_Controller-Plugins-ErrorHandler.xml" />
235 <xi:include href="Zend_Controller-Plugins-PutHandler.xml" />