1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 20765 -->
4 <sect1 id="zend.controller.actionhelpers" xmlns:xi="http://www.w3.org/2001/XInclude">
5 <title>アクションヘルパー</title>
7 <sect2 id="zend.controller.actionhelper.introduction">
11 アクションヘルパーを使用すると、<classname>Zend_Controller_Action</classname>
12 を継承した任意のアクションコントローラに対して
13 実行時やその他必要に応じて機能を追加できます。
15 アクションコントローラに共通機能を追加するために
16 いちいち抽象クラスを継承する手間を省くことにあります。
20 アクションヘルパーにはさまざまな使用法があります。
22 linkend="zend.view.helpers">Zend_View_Helper</link>
24 linkend="zend.controller.plugins">Zend_Controller_Plugin</link>
25 と同じように、処理の仲買をするために用いることもできます。
26 アクションヘルパーは (<classname>Zend_View_Helper</classname> と同様に)、
27 必要になった時点で読み込むこともできますし、
28 リクエスト時 (起動時) やアクションコントローラの作成時 (<methodname>init()</methodname>)
29 で読み込むこともできます。詳細は、以下の使用例を参照ください。
33 <sect2 id="zend.controller.actionhelper.initialization">
34 <title>ヘルパーの初期化</title>
37 ヘルパーを初期化するにはいくつかの方法があります。
38 必要に応じて、またそのヘルパーの機能に応じて使い分けましょう。
42 ヘルパーブローカは、<classname>Zend_Controller_Action</classname>
43 の <varname>$_helper</varname> に格納されます。
44 このブローカを使用して、ヘルパーを取得したりコールしたりします。
51 明示的に <methodname>getHelper()</methodname> を使用します。
56 <programlisting language="php"><![CDATA[
57 $flashMessenger = $this->_helper->getHelper('FlashMessenger');
58 $flashMessenger->addMessage('先ほどのリクエストで、あることをしました');
64 ヘルパーブローカの <methodname>__get()</methodname> 機能を使用すると、
65 まるでブローカのプロパティであるかのようにヘルパーを操作できます。
68 <programlisting language="php"><![CDATA[
69 $flashMessenger = $this->_helper->FlashMessenger;
70 $flashMessenger->addMessage('先ほどのリクエストで、あることをしました');
77 <methodname>direct()</methodname> メソッドを実装しており、
78 これはそのヘルパーのデフォルトメソッドをコールします。
79 <methodname>FlashMessenger</methodname> の例では、
80 <methodname>addMessage()</methodname> をコールします。
83 <programlisting language="php"><![CDATA[
84 $this->_helper->FlashMessenger('先ほどのリクエストで、あることをしました');
90 <para>これらの例は、すべて同じことを行っています。</para>
94 ヘルパーのインスタンスを明示的に作成したいと考えるかもしれません。
95 たとえばアクションコントローラ以外からヘルパーを使用したいだとか、
96 すべてのアクションのヘルパーブローカに同じヘルパーを渡したいだとかいった場合です。
97 インスタンスを作成する方法は、通常の <acronym>PHP</acronym> のクラスと同じです。
101 <sect2 id="zend.controller.actionhelper.broker">
102 <title>ヘルパーブローカ</title>
105 <classname>Zend_Controller_Action_HelperBroker</classname>
106 がヘルパーオブジェクトやそのパスの登録に関する詳細を処理します。
107 また、必要に応じてそこからヘルパーを取得できます。
112 <methodname>addHelper()</methodname> を使用します。
115 <programlisting language="php"><![CDATA[
116 Zend_Controller_Action_HelperBroker::addHelper($helper);
120 もちろん、ヘルパーのインスタンスを作成してそれをブローカに渡すという作業は
121 時間とリソースを消費します。これらの作業の手間をほんの少し省くためのメソッドとして、
122 <methodname>addPrefix()</methodname> と
123 <methodname>addPath()</methodname> が用意されています。
129 <methodname>addPrefix()</methodname> はクラスのプレフィックスを受け取り、
130 それをもとにヘルパークラスのパスを決定します。
131 プレフィックスが、Zend Framework のクラス命名規約に沿っているものとみなして、
135 <programlisting language="php"><![CDATA[
136 // My/Action/Helpers/ にある、名前が My_Action_Helpers で始まるヘルパーを追加します
137 Zend_Controller_Action_HelperBroker::addPrefix('My_Action_Helpers');
143 <methodname>addPath()</methodname> は、最初の引数にディレクトリ、
144 そして二番目の引数にクラスのプレフィックス
145 (デフォルトは '<classname>Zend_Controller_Action_Helper</classname>') を指定します。
146 これは、指定したディレクトリにある指定したプレフィックスのクラスを追加します。
149 <programlisting language="php"><![CDATA[
150 // Plugins/Helpers/ にある、名前が Helper で始まるヘルパーを追加します
151 Zend_Controller_Action_HelperBroker::addPath('./Plugins/Helpers',
158 これらは静的メソッドなので、コントローラチェイン内の任意の場所で使用できます。
159 これにより、必要に応じて動的にヘルパーを追加できることになります。
163 内部的には、ヘルパーブローカは <link
164 linkend="zend.loader.pluginloader">PluginLoader
165 のインスタンス</link> を用いてパスを保持します。静的メソッド
166 <methodname>getPluginLoader()</methodname> で PluginLoader
167 を取得することもできますし、また独自の PluginLoader
168 インスタンスを <methodname>setPluginLoader()</methodname> で設定することもできます。
172 ヘルパークラスがヘルパーブローカ内に存在するかどうかを調べるには
173 <methodname>hasHelper($name)</methodname> を使用します。<varname>$name</varname>
174 には、ヘルパーのショートネーム (プレフィックスを除いたもの)
178 <programlisting language="php"><![CDATA[
179 // 'redirector' ヘルパーがブローカに登録されているかどうかを調べます
180 if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
181 echo 'Redirector helper registered';
186 ヘルパーブローかからヘルパーを取得する静的メソッドには、さらに
187 <methodname>getExistingHelper()</methodname> と
188 <methodname>getStaticHelper()</methodname> のふたつがあります。
189 <methodname>getExistingHelper()</methodname> は、すでに起動されているか、
190 あるいは明示的にヘルパーブローカに登録されているヘルパーのみを取得します。
192 <methodname>getStaticHelper()</methodname> は
193 <methodname>getExistingHelper()</methodname> と同じですが、
194 ヘルパースタックに登録されていないヘルパーについてはそのインスタンスを作成しようとします。
196 <methodname>getStaticHelper()</methodname> がおすすめです。
200 どちらのメソッドも、引数はひとつだけです。
201 この引数 <varname>$name</varname>
202 には、ヘルパーのショートネーム (プレフィックスを除いたもの)
206 <programlisting language="php"><![CDATA[
207 // 'redirector' ヘルパーがブローカに登録されているかどうかを調べ、取得します
208 if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
210 Zend_Controller_Action_HelperBroker::getExistingHelper('redirector');
213 // あるいは、登録されているかどうかを気にせずに単純に取得します
215 Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
220 最後に、登録済みのヘルパーをブローカから削除するには
221 <methodname>removeHelper($name)</methodname> を使用します。<varname>$name</varname>
222 には、ヘルパーのショートネーム (プレフィックスを除いたもの)
226 <programlisting language="php"><![CDATA[
227 // 'redirector' ヘルパーがブローカに登録されている場合にはそれを削除します
228 if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
229 Zend_Controller_Action_HelperBroker::removeHelper('redirector')
234 <sect2 id="zend.controller.actionhelper.stockhelpers">
235 <title>組み込みのアクションヘルパー</title>
238 Zend Framework には、いくつかのアクションヘルパーがデフォルトで組み込まれています。
239 <acronym>AJAX</acronym> のオートコンプリート機能用のレスポンスを作成する <emphasis>AutoComplete</emphasis>、
240 アクションに応じてレスポンスの形式を変更する <emphasis>ContextSwitch</emphasis> と
241 <emphasis>AjaxContext</emphasis>、セッション単位のフラッシュメッセージを扱う
242 <emphasis>FlashMessenger</emphasis>、<acronym>JSON</acronym> 形式へのエンコードとレスポンスの送信を行う
243 <emphasis>Json</emphasis>、
244 アプリケーション内から内部あるいは外部へのリダイレクトを実装できるようにする
245 <emphasis>Redirector</emphasis>、そして
246 コントローラ内でのビューオブジェクトの設定とビューのレンダリングを自動化する
247 <emphasis>ViewRenderer</emphasis> です。
250 <xi:include href="Zend_Controller-ActionHelpers-ActionStack.xml" />
251 <xi:include href="Zend_Controller-ActionHelpers-AutoComplete.xml" />
252 <xi:include href="Zend_Controller-ActionHelpers-ContextSwitch.xml" />
253 <xi:include href="Zend_Controller-ActionHelpers-FlashMessenger.xml" />
254 <xi:include href="Zend_Controller-ActionHelpers-Json.xml" />
255 <xi:include href="Zend_Controller-ActionHelpers-Redirector.xml" />
256 <xi:include href="Zend_Controller-ActionHelpers-ViewRenderer.xml" />
259 <sect2 id="zend.controller.actionhelper.writingyourown">
260 <title>独自のヘルパーの作成</title>
264 <classname>Zend_Controller_Action_Helper_Abstract</classname>
266 ここには、基本的なインターフェイスやヘルパーブローカが使用する必須機能などが含まれています。
273 <methodname>setActionController()</methodname>
274 を使用して、現在のアクションコントローラを設定します。
280 <methodname>init()</methodname>
281 はヘルパーブローカによって起動時に実行され、
283 アクションチェイン内の複数のコントローラで同一のヘルパーを使用している場合に
290 <methodname>preDispatch()</methodname>
291 はディスパッチアクションの前に実行されます。
297 <methodname>postDispatch()</methodname>
298 はディスパッチアクションが終了した後で実行されます。
299 <methodname>preDispatch()</methodname> プラグインがアクションの処理をスキップした場合も、
300 これは実行されます。後始末などをここで行います。
306 <methodname>getRequest()</methodname>
307 は現在のリクエストオブジェクトを取得します。
313 <methodname>getResponse()</methodname>
314 は現在のレスポンスオブジェクトを取得します。
320 <methodname>getName()</methodname>
322 クラス名にアンダースコアが含まれる場合は最後のアンダースコア以降の文字、
323 そうでない場合はクラス名全体を返します。たとえば、クラス名が
324 <classname>Zend_Controller_Action_Helper_Redirector</classname>
325 の場合は <emphasis>Redirector</emphasis> を、クラス名が
326 <classname>FooMessage</classname> の場合はそのままの名前を返します。
332 オプションで、ヘルパークラスに <methodname>direct()</methodname>
333 メソッドを実装することもできます。これを定義しておくと、
334 ヘルパーブローカのメソッドであるかのようにそのヘルパーを扱えるようになります。
335 これにより、一度だけ使用するようなヘルパーが扱いやすくなります。
337 linkend="zend.controller.actionhelpers.redirector">redirector</link>
338 の <methodname>direct()</methodname> は <methodname>goto()</methodname>
339 のエイリアスとなっているので、このようにして使用できます。
342 <programlisting language="php"><![CDATA[
343 // /blog/view/item/id/42 にリダイレクトします
344 $this->_helper->redirector('item', 'view', 'blog', array('id' => 42));
348 内部的には、まずヘルパーブローカの <methodname>__call()</methodname>
349 メソッドが <emphasis>redirector</emphasis> という名前のヘルパーを探し、
350 それからそのヘルパーで <methodname>direct()</methodname>
352 渡された引数でそのメソッドをコールしています。
357 上で説明したようにしてそれを利用できるようにしておきましょう。