[GENERIC] Zend_Translate:
[zend.git] / documentation / manual / ja / module_specs / Zend_Controller-FrontController.xml
blob9c2654094d88e5b838f0c3ed8eadce1c7f38a970
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- Reviewed: no -->
3 <!-- EN-Revision: 17175 -->
4 <sect1 id="zend.controller.front">
5     <title>フロントコントローラ</title>
7     <sect2 id="zend.controller.front.overview">
8         <title>概要</title>
10         <para>
11             <classname>Zend_Controller_Front</classname> は
12             <ulink url="http://en.wikipedia.org/wiki/Model-view-controller">Model-View-Controller
13             (MVC)</ulink> アプリケーションで用いられる
14             <ulink url="http://www.martinfowler.com/eaaCatalog/frontController.html">
15             フロントコントローラパターン</ulink> を実装したものです。
16             その役割は、リクエスト環境を初期化してリクエストの配送先を決定し、
17             見つかった配送先に処理を引き渡すことです。また、
18             レスポンスの内容を取得してそれをコール元に返します。
19         </para>
21         <para>
22             <classname>Zend_Controller_Front</classname> は <ulink
23             url="http://en.wikipedia.org/wiki/Singleton_pattern">シングルトンパターン</ulink>
24             も実装しています。つまり、どんな場合でもひとつのインスタンスしか存在しないことになります。
25             これを利用すると、コントローラをレジストリとして扱えるようになります。
26         </para>
28         <para>
29             <classname>Zend_Controller_Front</classname> は <link
30                 linkend="zend.controller.plugins">プラグインブローカ</link>
31             を持っています。これにより、さまざまなイベントをプラグインで処理できるようになります。
32             開発者は、ディスパッチ処理をカスタマイズして機能を追加する際に
33             フロントコントローラ自体を継承したクラスを作成する必要がなくなります。
34         </para>
36         <para>
37             <link linkend="zend.controller.action">アクションコントローラ</link>
38             へのパスを含むディレクトリを最低ひとつは指定しないと、
39             フロントコントローラは動作しません。
40             フロントコントローラの動作環境やそのヘルパークラスを変更するために、
41             さまざまな手法が用意されています。
42         </para>
44         <note>
45             <title>デフォルトの挙動</title>
46             <para>
47                 デフォルトでは、フロントコントローラは
48                 <link linkend="zend.controller.plugins.standard.errorhandler">ErrorHandler</link>
49                 プラグインと
50                 <link linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>
51                 アクションヘルパープラグインを読み込みます。
52                 これらにより、コントローラ内でのエラー処理やビューのレンダリングがシンプルに行えるようになります。
53             </para>
55             <para>
56                 <emphasis>ErrorHandler</emphasis> を無効にするには、
57                 <methodname>dispatch()</methodname> をコールする前のどこかで以下のようにします。
58             </para>
60             <programlisting language="php"><![CDATA[
61 // ErrorHandler プラグインを無効にします
62 $front->setParam('noErrorHandler', true);
63 ]]></programlisting>
65             <para>
66                 <emphasis>ViewRenderer</emphasis> を無効にするには、
67                 <methodname>dispatch()</methodname> をコールする前に以下を実行します。
68             </para>
70             <programlisting language="php"><![CDATA[
71 // ViewRenderer ヘルパーを無効にします
72 $front->setParam('noViewRenderer', true);
73 ]]></programlisting>
74         </note>
75     </sect2>
77     <sect2 id="zend.controller.front.methods.primary">
78         <title>主要なメソッド</title>
80         <para>
81             フロントコントローラには、その環境設定用のメソッドがいくつか用意されています。
82             そのうち、フロントコントローラの機能の鍵となる主要なメソッドは、以下の3つです。
83         </para>
85         <sect3 id="zend.controller.front.methods.primary.getinstance">
86             <title>getInstance()</title>
88             <para>
89                 <methodname>getInstance()</methodname> は、フロントコントローラのインスタンスを取得します。
90                 フロントコントローラはシングルトンパターンを実装しているので、
91                 フロントコントローラのインスタンスを作成する唯一の方法はこのメソッドをコールすることとなります。
92             </para>
94             <programlisting language="php"><![CDATA[
95 $front = Zend_Controller_Front::getInstance();
96 ]]></programlisting>
97         </sect3>
99         <sect3 id="zend.controller.front.methods.primary.setcontrollerdirectory">
100             <title>setControllerDirectory() および addControllerDirectory</title>
102             <para>
103                 <methodname>setControllerDirectory()</methodname> は、<link
104                     linkend="zend.controller.dispatcher">ディスパッチャ</link>
105                 が <link
106                     linkend="zend.controller.action">アクションコントローラ</link>
107                 クラスファイルをどこから探せばよいのかを指定するメソッドです。
108                 単一のパスを指定することもできますし、複数のパスを連想配列で指定することもできます。
109             </para>
111             <para>
112                 いくつか例を示します。
113             </para>
115             <programlisting language="php"><![CDATA[
116 // デフォルトのコントローラディレクトリを設定します
117 $front->setControllerDirectory('../application/controllers');
119 // 複数のモジュールのディレクトリを一度に指定します
120 $front->setControllerDirectory(array(
121     'default' => '../application/controllers',
122     'blog'    => '../modules/blog/controllers',
123     'news'    => '../modules/news/controllers',
126 // 'foo' モジュールのディレクトリを追加します
127 $front->addControllerDirectory('../modules/foo/controllers', 'foo');
128 ]]></programlisting>
130             <note>
131                 <para>
132                     <methodname>addControllerDirectory()</methodname>
133                     でモジュール名を省略すると、<emphasis>default</emphasis>
134                     モジュールが指定されたものとみなします。
135                     もしすでに存在する場合は、それを上書きします。
136                 </para>
137             </note>
139             <para>
140                 コントローラディレクトリの現在の設定を取得するには
141                 <methodname>getControllerDirectory()</methodname> を使用します。
142                 これは、モジュールとディレクトリの組を配列で返します。
143             </para>
144         </sect3>
146         <sect3 id="zend.controller.front.methods.primary.addmoduledirectory">
147             <title>addModuleDirectory() および getModuleDirectory()</title>
149             <para>
150                 フロントコントローラのひとつの側面として、<link
151                     linkend="zend.controller.modular">モジュラーディレクトリ構造を定義
152                 </link> して単体のコンポーネントを作成するということがあります。
153                 これは "モジュール" と呼ばれます。
154             </para>
156             <para>
157                 書くモジュールは個別のディレクトリになければならず、
158                 またデフォルトモジュールと同じディレクトリ構成でなければなりません。
159                 すなわち、すくなくともサブディレクトリ <filename>/controllers/</filename> がなければならず、
160                 またたいていは <filename>/views/</filename> などの他のサブディレクトリもあるということです。
161             </para>
163             <para>
164                 <methodname>addModuleDirectory()</methodname>
165                 には、ひとつあるいは複数のモジュールディレクトリの名前を渡します。
166                 渡された内容を調べ、それをフロントコントローラのコントローラディレクトリに追加します。
167             </para>
169             <para>
170                 その後、特定のモジュールや現在のモジュールへのパスを知りたい場合に
171                 <methodname>getModuleDirectory()</methodname> をコールします。
172                 モジュール名を渡すと、指定したモジュールのディレクトリを取得することができます。
173             </para>
174         </sect3>
176         <sect3 id="zend.controller.front.methods.primary.dispatch">
177             <title>dispatch()</title>
179             <para>
180                 <methodname>dispatch(Zend_Controller_Request_Abstract $request = null,
181                     Zend_Controller_Response_Abstract $response = null)</methodname>
182                 は、フロントコントローラでもっとも重要な仕事を担当します。
183                 オプションで <link linkend="zend.controller.request">リクエストオブジェクト</link>
184                 や <link linkend="zend.controller.response">レスポンスオブジェクト</link>
185                 を受け取り、それぞれ独自のオブジェクトを指定することができます。
186             </para>
188             <para>
189                 リクエストオブジェクトやレスポンスオブジェクトを省略すると、
190                 <methodname>dispatch()</methodname> は事前にオブジェクトが登録されているかどうかを確認します。
191                 もし登録されていればそれを使用し、登録されていなければデフォルトのオブジェクトを作成して使用します
192                 (どちらの場合についても、<acronym>HTTP</acronym> リクエスト/レスポンス オブジェクトをデフォルトで使用します)。
193             </para>
195             <para>
196                 同様に、<methodname>dispatch()</methodname> は <link
197                     linkend="zend.controller.router">ルータ</link> や <link
198                     linkend="zend.controller.dispatcher">ディスパッチャ</link>
199                 オブジェクトについても登録済みのものがあるかどうかを確認します。
200                 もしあればそれを使用し、なければデフォルトのオブジェクトを作成して使用します。
201             </para>
203             <para>
204                 ディスパッチ処理は、次の三段階に分けられます。
205             </para>
207             <itemizedlist>
208                 <listitem><para>ルーティング</para></listitem>
209                 <listitem><para>ディスパッチ</para></listitem>
210                 <listitem><para>レスポンス</para></listitem>
211             </itemizedlist>
213             <para>
214                 ルーティングは一度だけ発生します。これは、<methodname>dispatch()</methodname>
215                 がコールされた際のリクエストオブジェクトの内容を使用して行います。
216                 ディスパッチは繰り返し行われます。
217                 ひとつのリクエストが複数のアクションを指定している場合や、
218                 コントローラまたはプラグインがリクエストオブジェクトを設定しなおして
219                 別のアクションへディスパッチさせた場合などです。
220                 すべてが終了したら、フロントコントローラはレスポンスを返します。
221             </para>
222         </sect3>
224         <sect3 id="zend.controller.front.methods.primary.run">
225             <title>run()</title>
227             <para>
228                 <methodname>Zend_Controller_Front::run($path)</methodname>
229                 は静的メソッドで、コントローラを含むディレクトリへのパスを指定します。
230                 このメソッドは
231                 <link linkend="zend.controller.front.methods.primary.getinstance">getInstance()</link>
232                 を使用してフロントコントローラのインスタンスを取得し、
233                 <link linkend="zend.controller.front.methods.primary.setcontrollerdirectory">setControllerDirectory()</link>
234                 を使用してパスを登録し、最後に
235                 <link linkend="zend.controller.front.methods.primary.dispatch">ディスパッチ</link>
236                 します。
237             </para>
239             <para>
240                 <methodname>run()</methodname> は、サイト単位の設定などで
241                 フロントコントローラのカスタマイズが不要な場合に便利なメソッドです。
242             </para>
244             <programlisting language="php"><![CDATA[
245 // フロントコントローラを作成してコントローラディレクトリを設定し、
246 // ディスパッチするまでをいちどでお手軽に行います
247 Zend_Controller_Front::run('../application/controllers');
248 ]]></programlisting>
249         </sect3>
250     </sect2>
252     <sect2 id="zend.controller.front.methods.environment">
253         <title>環境へのアクセス用メソッド群</title>
255         <para>
256             これまでに説明したメソッド以外にもさまざまなアクセス用メソッドが用意されており、
257             これらを使用してフロンとコントローラの環境にアクセスすることができます。
258             つまり、フロントコントローラが処理を委譲しているクラスの環境にもアクセスできるということです。
259         </para>
261         <itemizedlist>
262             <listitem>
263                 <para>
264                     <methodname>resetInstance()</methodname> は、現在の設定をすべて消去します。
265                     主にテスト目的で使用しますが、
266                     複数のフロントコントローラを連結させたい場合などに使用することもあります。
267                 </para>
268             </listitem>
270             <listitem>
271                 <para>
272                     <methodname>setDefaultControllerName()</methodname> および
273                     <methodname>getDefaultControllerName()</methodname>
274                     で、デフォルトのコントローラとして使用する名前を指定したり
275                     (指定しなければ 'index' となります) 現在の設定を取得したりできます。
276                     これらメソッドは、<link linkend="zend.controller.dispatcher">
277                     ディスパッチャ</link> へのプロキシです。
278                 </para>
279             </listitem>
281             <listitem>
282                 <para>
283                     <methodname>setDefaultAction()</methodname> および
284                     <methodname>getDefaultAction()</methodname>
285                     で、デフォルトのアクションとして使用する名前を指定したり
286                     (指定しなければ 'index' となります) 現在の設定を取得したりできます。
287                     これらのメソッドは <link linkend="zend.controller.dispatcher">
288                     ディスパッチャ</link> へのプロキシです。
289                 </para>
290             </listitem>
292             <listitem>
293                 <para>
294                     <methodname>setRequest()</methodname> および
295                     <methodname>getRequest()</methodname> は、ディスパッチ処理で使用する
296                     <link linkend="zend.controller.request">リクエスト</link>
297                     クラスやオブジェクトを指定したり、現在のオブジェクトを取得したりします。
298                     リクエストオブジェクトを指定するときに、クラス名を指定することができます。
299                     この場合、このメソッドは指定したクラスファイルを読み込んでインスタンスを作成します。
300                 </para>
301             </listitem>
303             <listitem>
304                 <para>
305                     <methodname>setRouter()</methodname> および
306                     <methodname>getRouter()</methodname> は、ディスパッチ処理で使用する
307                     <link linkend="zend.controller.router">ルータ</link>
308                     クラスやオブジェクトを指定したり、現在のオブジェクトを取得したりします。
309                     ルータオブジェクトを指定するときに、クラス名を指定することができます。
310                     この場合、このメソッドは指定したクラスファイルを読み込んでインスタンスを作成します。
311                 </para>
313                 <para>
314                     ルータオブジェクトを取得する際には、まずルータが存在するかどうかを調べ、
315                     存在しない場合にはデフォルトのルータ (rewrite ルータ) のインスタンスを作成します。
316                 </para>
317             </listitem>
319             <listitem>
320                 <para>
321                     <methodname>setBaseUrl()</methodname> および
322                     <methodname>getBaseUrl()</methodname> は、リクエストのルーティング時に <acronym>URL</acronym> から取り除く
323                     <link linkend="zend.controller.request.http.baseurl">基底 <acronym>URL</acronym></link>
324                     を指定したり、現在の値を取得したりします。
325                     この値は、ルーティングの直前にリクエストオブジェクトに渡されます。
326                 </para>
327             </listitem>
329             <listitem>
330                 <para>
331                     <methodname>setDispatcher()</methodname> および
332                     <methodname>getDispatcher()</methodname> は、ディスパッチ処理で使用する
333                     <link linkend="zend.controller.dispatcher">ディスパッチャ</link>
334                     クラスやオブジェクトを指定したり、現在のオブジェクトを取得したりします。
335                     ディスパッチャオブジェクトを指定するときに、クラス名を指定することができます。
336                     この場合、このメソッドは指定したクラスファイルを読み込んでインスタンスを作成します。
337                 </para>
339                 <para>
340                     ディスパッチャオブジェクトを取得する際には、まずディスパッチャが存在するかどうかを調べ、
341                     存在しない場合にはデフォルトのディスパッチャのインスタンスを作成します。
342                 </para>
343             </listitem>
345             <listitem>
346                 <para>
347                     <methodname>setResponse()</methodname> および
348                     <methodname>getResponse()</methodname> は、ディスパッチ処理で使用する
349                     <link linkend="zend.controller.response">レスポンス</link>
350                     クラスやオブジェクトを指定したり、現在のオブジェクトを取得したりします。
351                     レスポンスオブジェクトを指定するときに、クラス名を指定することができます。
352                     この場合、このメソッドは指定したクラスファイルを読み込んでインスタンスを作成します。
353                 </para>
354             </listitem>
356             <listitem>
357                 <para>
358                     <methodname>registerPlugin(Zend_Controller_Plugin_Abstract $plugin, $stackIndex = null)</methodname>
359                     は、<link linkend="zend.controller.plugins">プラグインオブジェクト</link>
360                     を登録します。オプションの <varname>$stackIndex</varname>
361                     を設定すると、プラグインの実行順を制御することができます。
362                 </para>
363             </listitem>
365             <listitem>
366                 <para>
367                     <methodname>unregisterPlugin($plugin)</methodname> は、
368                     <link linkend="zend.controller.plugins">プラグインオブジェクト</link>
369                     の登録を解除します。<varname>$plugin</varname>
370                     にはプラグインオブジェクトそのものか、あるいはプラグインのクラス名を表す文字列を指定します。
371                     ここで指定したプラグインの登録を解除します。
372                 </para>
373             </listitem>
375             <listitem>
376                 <para>
377                     <methodname>throwExceptions($flag)</methodname> で、ディスパッチの際に発生した例外をスローするかどうかを切り替えます。
378                     デフォルトでは、例外はスローされず、
379                     <link linkend="zend.controller.response">レスポンスオブジェクト</link>
380                     に保存されます。<methodname>throwExceptions()</methodname>
381                     をオンにすると、この挙動を変更できます。
382                 </para>
384                 <para>
385                     詳細は <link linkend="zend.controller.exceptions">MVC
386                     例外</link> を参照ください。
387                 </para>
388             </listitem>
390             <listitem>
391                 <para>
392                     <methodname>returnResponse($flag)</methodname> は、フロントコントローラが
393                     <methodname>dispatch()</methodname> からのレスポンスを返す (<constant>TRUE</constant>)
394                     かレスポンスを自動的に発行する (<constant>FALSE</constant>)
395                     かを切り替えます。デフォルトでは、レスポンスは
396                     (<methodname>Zend_Controller_Response_Abstract::sendResponse()</methodname> によって)
397                     自動的に発行されます。<methodname>returnResponse()</methodname>
398                     をオンにすると、この挙動を変更できます。
399                     behaviour.
400                 </para>
402                 <para>
403                     レスポンスを返すようにする理由としては、
404                     実際に発行する前に例外のチェックを行いたり
405                     レスポンスの情報 (ヘッダなど) をログに記録したりなどが考えられます。
406                 </para>
407             </listitem>
408         </itemizedlist>
409     </sect2>
411     <sect2 id="zend.controller.front.methods.params">
412         <title>フロントコントローラのパラメータ</title>
414         <para>
415             最初のほうで、フロントコントローラはレジストリとしても使用できると説明しました。
416             その際に使用するのが "param" 系のメソッド群です。
417             これらのメソッドを使用すると、任意のデータ (オブジェクトや変数)
418             をフロントコントローラに登録することができます。
419             登録したデータは、ディスパッチチェイン内のどこででも使用できます。
420             これらの値は、ルータやディスパッチャそしてアクションコントローラにも渡されます。
421             各メソッドについて、以下にまとめます。
422         </para>
424         <itemizedlist>
425             <listitem>
426                 <para>
427                     <methodname>setParam($name, $value)</methodname> は、
428                     パラメータ <varname>$name</varname> の値を
429                     <varname>$value</varname> に設定します。
430                 </para>
431             </listitem>
433             <listitem>
434                 <para>
435                     <methodname>setParams(array $params)</methodname> は、
436                     連想配列を使用して複数のパラメータを一度に設定します。
437                 </para>
438             </listitem>
440             <listitem>
441                 <para>
442                     <methodname>getParam($name)</methodname> は、
443                     <varname>$name</varname> で指定した名前のパラメータの値を取得します。
444                 </para>
445             </listitem>
447             <listitem>
448                 <para>
449                     <methodname>getParams()</methodname> は、
450                     すべてのパラメータの一覧を一度に取得します。
451                 </para>
452             </listitem>
454             <listitem>
455                 <para>
456                     <methodname>clearParams()</methodname> は、
457                     単一のパラメータ (文字列で指定した場合) か
458                     複数のパラメータ (文字列の配列で指定した場合)、
459                     またはすべてのパラメータ (何も指定しなかった場合)
460                     を消去します。
461                 </para>
462             </listitem>
463         </itemizedlist>
465         <para>
466             ディスパッチチェイン内で特定の目的で使用するために、
467             いくつかのパラメータが事前に定義されています。
468         </para>
470         <itemizedlist>
471             <listitem>
472                 <para>
473                     <emphasis>useDefaultControllerAlways</emphasis> は、
474                     ディスパッチできない
475                     (モジュール、コントローラ、アクションのいずれかが存在しない)
476                     リクエストに対して、
477                     デフォルトモジュールのデフォルトコントローラにディスパッチするよう
478                     <link linkend="zend.controller.dispatcher">ディスパッチャ</link>
479                     に指示します。デフォルトではこの機能は無効になっています。
480                 </para>
482                 <para>
483                     この設定の使用法についての詳細は
484                     <link linkend="zend.controller.exceptions.internal">
485                     遭遇するであろう MVC 例外</link>
486                     を参照ください。
487                 </para>
488             </listitem>
490             <listitem>
491                 <para>
492                     <emphasis>disableOutputBuffering</emphasis> は、
493                     アクションコントローラの出力をバッファリングしないよう
494                     <link linkend="zend.controller.dispatcher">ディスパッチャ</link>
495                     に指示します。デフォルトでは、
496                     ディスパッチャがいったんすべての出力をキャプチャして、
497                     レスポンスオブジェクトに追加しています。
498                 </para>
499             </listitem>
501             <listitem>
502                 <para>
503                     <emphasis>noViewRenderer</emphasis> を使用して、<link
504                         linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>
505                     を無効にします。このパラメータを <constant>TRUE</constant> に設定すると、無効となります。
506                 </para>
507             </listitem>
509             <listitem>
510                 <para>
511                     <emphasis>noErrorHandler</emphasis> を使用して、<link
512                         linkend="zend.controller.plugins.standard.errorhandler">
513                     エラーハンドラプラグイン</link> を無効にします。
514                     このパラメータを <constant>TRUE</constant> に設定すると、無効となります。
515                 </para>
516             </listitem>
517         </itemizedlist>
518     </sect2>
520     <sect2 id="zend.controller.front.subclassing">
521         <title>フロントコントローラの継承</title>
523         <para>
524             フロントコントローラを継承する際には、
525             最低限 <methodname>getInstance()</methodname> メソッドをオーバーライドしなければなりません。
526         </para>
528         <programlisting language="php"><![CDATA[
529 class My_Controller_Front extends Zend_Controller_Front
531     public static function getInstance()
532     {
533         if (null === self::$_instance) {
534             self::$_instance = new self();
535         }
537         return self::$_instance;
538     }
540 ]]></programlisting>
542         <para>
543             <methodname>getInstance()</methodname> メソッドをオーバーライドすることで、それ以降の
544             <methodname>Zend_Controller_Front::getInstance()</methodname> のコールが
545             <classname>Zend_Controller_Front</classname> ではなく新しいサブクラスのインスタンスを返すようになります。
546             これは、デフォルト以外のルータやビューヘルパーを使用する場合などに便利です。
547         </para>
549         <para>
550             何か新しい機能 (たとえばプラグインの自動ローダーや、
551             アクションヘルパーのパスの指定方法)
552             を追加したいというのでもない限り、
553             ふつうはフロントコントローラのサブクラスを作成する必要はありません。
554             ほかに変更したくなるような箇所としては、
555             コントローラディレクトリの保存方法や
556             デフォルトルータ/デフォルトディスパッチャを使用するかどうかなどがあるでしょう。
557         </para>
558     </sect2>
559 </sect1>
560 <!--
561 vim:se ts=4 sw=4 et: