1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 20765 -->
4 <sect1 id="zend.controller.request">
5 <title>リクエストオブジェクト</title>
6 <sect2 id="zend.controller.request.introduction">
9 リクエストオブジェクトとは <classname>Zend_Controller_Front</classname> とルータ、
10 ディスパッチャそしてコントローラクラスの間でやり取りされる単純なバリューオブジェクトです。
11 これはコントローラ、アクションそして環境 (<acronym>HTTP</acronym>、<acronym>CLI</acronym>、<acronym>PHP</acronym>-GTK など)
12 に応じたその他のパラメータの内容をまとめたものです。
18 <methodname>getModuleName()</methodname> および
19 <methodname>setModuleName()</methodname> を使用します。
24 <methodname>getControllerName()</methodname> および
25 <methodname>setControllerName()</methodname> を使用します。
29 コントローラ内でコールするアクションの名前にアクセスするには
30 <methodname>getActionName()</methodname> および
31 <methodname>setActionName()</methodname> を使用します。
36 キー/値 の組み合わせの連想配列となります。これらを取得するには
37 <methodname>getParams()</methodname> を、そして設定するには
38 <methodname>setParams()</methodname> を使用します。各パラメータを個別に扱うには
39 <methodname>getParam()</methodname> および <methodname>setParam()</methodname> を使用します。
44 リクエストの型によっては、その他のメソッドが使用できることもあります。
46 <classname>Zend_Controller_Request_Http</classname> の場合は、
47 リクエストされた <acronym>URI</acronym> やパス情報、
48 <varname>$_GET</varname> パラメータや <varname>$_POST</varname>
49 パラメータを取得するメソッドが使用可能となります。
53 リクエストオブジェクトはフロントコントローラに渡されます。
54 もしリクエストオブジェクトがなかった場合は、
55 ディスパッチ処理の最初 (ルーティングが発生する前)
57 ディスパッチチェインのすべてのオブジェクトに渡されていきます。
61 さらに、リクエストオブジェクトはテストの際にも有用です。
62 開発者がリクエストを作成し、コントローラやアクション、
63 パラメータや <acronym>URI</acronym> などを指定してそれをフロントコントローラに渡すことで、
65 <link linkend="zend.controller.response">レスポンスオブジェクト</link>
67 <acronym>MVC</acronym> アプリケーションの精密で正確な単体テストが可能となります。
71 <sect2 id="zend.controller.request.http">
72 <title>HTTP リクエスト</title>
74 <sect3 id="zend.controller.request.http.dataacess">
75 <title>リクエストデータへのアクセス</title>
78 <classname>Zend_Controller_Request_Http</classname> は、関連する値へのアクセスをカプセル化します。
79 たとえばコントローラやアクションルータの変数のキー名や値、
80 <acronym>URI</acronym> からパースした追加のパラメータの値などにアクセスできます。
81 <classname>Zend_Controller_Request_Http</classname> のプロキシとして動作することで、
82 スーパーグローバルの値にパブリックメンバとしてアクセスしたり、
83 現在のベース <acronym>URL</acronym> やリクエスト <acronym>URI</acronym> を管理することもできます。
84 スーパーグローバルの値はリクエストオブジェクトに設定することはできません。
85 そのかわりに <methodname>setParam()</methodname> および <methodname>getParam()</methodname> メソッドを使用して、
90 <title>スーバーグローバルデータ</title>
92 <classname>Zend_Controller_Request_Http</classname> のパブリックプロパティを使用して
93 スーパーグローバルデータにアクセスする際に注意すべき点は、
94 プロパティ名 (スーバーグローバル配列のキー)
95 は以下の優先順位でマッチするということです。
96 1. <constant>GET</constant>, 2. <constant>POST</constant>, 3. <constant>COOKIE</constant>,
97 4. <constant>SERVER</constant>, 5. <constant>ENV</constant>.
102 特定のスーパーグローバルにアクセスするには、
103 パブリックメソッドを使用する方法もあります。たとえば、
104 <varname>$_POST['user']</varname> の値を取得するには、リクエストオブジェクト上で
105 <methodname>getPost('user')</methodname> をコールします。同様に、
106 <varname>$_GET</varname> 要素の場合は <methodname>getQuery()</methodname>、
107 リクエストヘッダの場合は <methodname>getHeader()</methodname>
112 <title>GET および POST データ</title>
114 リクエストオブジェクトのデータを扱う際には注意しましょう。
115 これらのデータは、一切フィルタリングを行っていません。
116 ルータやディスパッチャのほうで適切な検証とフィルタリングを行うので、
117 リクエストオブジェクト内のデータはそのままにしておきましょう。
122 <title>生の POST データの取得</title>
126 <methodname>getRawBody()</methodname> メソッドで取得できます。
127 このメソッドは、データが送信されていない場合は <constant>FALSE</constant> を返します。
128 送信されている場合は、投稿内容の本文全体を返します。
132 これは、RESTful な <acronym>MVC</acronym>
133 アプリケーションを開発するにあたって非常に有用です。
138 ユーザパラメータをリクエストオブジェクトに設定するには
139 <methodname>setParam()</methodname> を、後でそれを取得するには
140 <methodname>getParam()</methodname> を使用します。
141 ルータは、リクエスト <acronym>URI</acronym> にマッチしたパラメータを
142 リクエストオブジェクトに設定する際にこの機能を使用します。
146 <title>getParam() でのユーザパラメータ以外の取得</title>
149 <methodname>getParam()</methodname> は、実際にはユーザパラメータ以外のところからも情報を取得しています。
150 優先順位の高い順に並べると、まず最初は <methodname>setParam()</methodname>
151 で設定したパラメータ、それから <constant>GET</constant> パラメータ、
152 <constant>POST</constant> パラメータの順になります。
153 このメソッドを使用する際には、この点に注意しましょう。
157 <methodname>setParam()</methodname> で設定したパラメータからだけ取得したい場合は、
158 <methodname>getUserParam()</methodname> を使用します。
163 どのパラメータから検索するかを制限できます。
164 <methodname>setParamSources()</methodname> に空の配列あるいは
165 値 '_GET' や '_POST' を含む配列を指定して使用します
166 (デフォルトでは両方が指定されています)。'_GET'
168 <methodname>setParamSources(array('_GET'))</methodname> とします。
173 <title>Apache のおかしな挙動</title>
175 Apache の 404 ハンドラを使用して
176 リクエストをフロントコントローラに渡したり、
177 PT フラグを rewrite ルールで使用したりする場合は、
178 必要な <acronym>URI</acronym> 情報が含まれるのが
179 <varname>$_SERVER['REQUEST_URI']</varname>
180 ではなく <varname>$_SERVER['REDIRECT_URL']</varname>
182 この設定を使用して無効なルーティングを取得したい場合は、
184 <classname>Zend_Controller_Request_Apache404</classname>
185 クラスを使用してリクエストオブジェクトを作成しなければなりません。
188 <programlisting language="php"><![CDATA[
189 $request = new Zend_Controller_Request_Apache404();
190 $front->setRequest($request);
195 <classname>Zend_Controller_Request_Http</classname>
196 クラスを継承したもので、リクエスト <acronym>URI</acronym>
198 これは、単純にもとのクラスと差し替えて使用できます。
203 <sect3 id="zend.controller.request.http.baseurl">
204 <title>ベース URL およびサブディレクトリ</title>
207 <classname>Zend_Controller_Request_Http</classname> は、
208 サブディレクトリで <classname>Zend_Controller_Router_Rewrite</classname> を使用できます。
209 <classname>Zend_Controller_Request_Http</classname> は自動的にベース <acronym>URL</acronym> を検出し、
214 たとえば、<filename>index.php</filename> をウェブサーバのサブディレクトリ
215 <filename>/projects/myapp/index.php</filename> においた場合は、ベース <acronym>URL</acronym>
216 (rewrite base) は <filename>/projects/myapp</filename> にしなければなりません。
217 マッチするルートを見つける前に、この文字列がパスの先頭から取り除かれます。
218 これにより、すべてのルートに余計な文字を追加する必要がなくなります。
219 ルート <command>'user/:username'</command> は、
220 <filename>http://localhost/projects/myapp/user/martel</filename> および
221 <filename>http://example.com/user/martel</filename> の両方にマッチするようになります。
225 <title>URL の検出は大文字小文字を区別します</title>
227 自動的なベース <acronym>URL</acronym> の検出処理は大文字小文字を区別します。そのため、
228 <acronym>URL</acronym> とファイルシステムのサブディレクトリ名が確実に一致する必要があります
229 (たとえ Windows マシンであっても同様です)。大文字小文字が一致しなかった場合は、
235 ベース <acronym>URL</acronym> の検出に失敗する場合は、
236 <classname>Zend_Controller_Request_Http</classname> クラス、あるいは
237 <classname>Zend_Controller_Front</classname> クラスの
238 <methodname>setBaseUrl()</methodname> メソッドを使用して
240 一番簡単な方法は <classname>Zend_Controller_Front</classname> で設定することです。
241 この設定はリクエストオブジェクトに引き継がれます。
242 独自のベース <acronym>URL</acronym> を設定する例を示します。
245 <programlisting language="php"><![CDATA[
247 * Zend_Controller_Front で独自のベース URL を指定することによるリクエストのディスパッチ
249 $router = new Zend_Controller_Router_Rewrite();
250 $controller = Zend_Controller_Front::getInstance();
251 $controller->setControllerDirectory('./application/controllers')
253 ->setBaseUrl('/projects/myapp'); // ベース URL を指定します!
254 $response = $controller->dispatch();
259 <sect3 id="zend.controller.request.http.method">
260 <title>リクエストメソッドの判定</title>
263 <methodname>getMethod()</methodname> では、
264 現在のリソースへのリクエストの際に使用した
265 <acronym>HTTP</acronym> メソッドを判定できます。
266 さらに、指定した型のリクエストであったかどうかを判定するための
271 <listitem><para><methodname>isGet()</methodname></para></listitem>
272 <listitem><para><methodname>isPost()</methodname></para></listitem>
273 <listitem><para><methodname>isPut()</methodname></para></listitem>
274 <listitem><para><methodname>isDelete()</methodname></para></listitem>
275 <listitem><para><methodname>isHead()</methodname></para></listitem>
276 <listitem><para><methodname>isOptions()</methodname></para></listitem>
280 これらの主な使用法は、RESTfult な
281 <acronym>MVC</acronym> アーキテクチャを作成することです。
285 <sect3 id="zend.controller.request.http.ajax">
286 <title>AJAX リクエストの検出</title>
289 <classname>Zend_Controller_Request_Http</classname> には、
290 <acronym>AJAX</acronym> リクエストを検出するための基本的なメソッド
291 <methodname>isXmlHttpRequest()</methodname> が用意されています。
292 このメソッドは、<acronym>HTTP</acronym> リクエストヘッダ
293 <emphasis>X-Requested-With</emphasis> に
294 'XMLHttpRequest' という値が設定されているかどうかを調べ、
295 設定されている場合に <constant>TRUE</constant> を返します。
299 現時点では、次の JS ライブラリがデフォルトでこのヘッダを渡すようです。
303 <listitem><para>Prototype/Scriptaculous (その他
304 Prototype 系のライブラリ)</para></listitem>
305 <listitem><para>Yahoo! UI Library</para></listitem>
306 <listitem><para>jQuery</para></listitem>
307 <listitem><para>MochiKit</para></listitem>
311 大半の <acronym>AJAX</acronym> ライブラリは、独自の <acronym>HTTP</acronym> リクエストヘッダを送信できます。
312 ご利用のライブラリがこのヘッダを送信していない場合は、
314 <methodname>isXmlHttpRequest()</methodname> メソッドの動作を期待通りにできます。
319 <sect2 id="zend.controller.request.subclassing">
320 <title>リクエストオブジェクトのサブクラスの作成</title>
323 すべてのリクエストオブジェクトクラスは、抽象クラス
324 <classname>Zend_Controller_Request_Abstract</classname> を継承しています。
325 このクラスでは、次のようなメソッドを定義しています。
328 <programlisting language="php"><![CDATA[
329 abstract class Zend_Controller_Request_Abstract
334 public function getControllerName();
337 * @param string $value
340 public function setControllerName($value);
345 public function getActionName();
348 * @param string $value
351 public function setActionName($value);
356 public function getControllerKey();
362 public function setControllerKey($key);
367 public function getActionKey();
373 public function setActionKey($key);
379 public function getParam($key);
383 * @param mixed $value
386 public function setParam($key, $value);
391 public function getParams();
394 * @param array $array
397 public function setParams(array $array);
400 * @param boolean $flag
403 public function setDispatched($flag = true);
408 public function isDispatched();
413 リクエストオブジェクトは、リクエスト環境のコンテナとなります。
414 コントローラチェインが知っておくべきことは、
415 コントローラやアクション、オプションパラメータ、ディスパッチ状況
418 コントローラおよびアクションを決定する際には
419 キー controller あるいは action を使用します。
423 このクラスかその派生クラスのいずれかを継承したクラスを作成することで、
424 上で説明した作業を独自のものに変更したクラスを作成できます。
425 例としては、たとえば <link linkend="zend.controller.request.http"><acronym>HTTP</acronym>
426 環境用</link> のクラスや <acronym>CLI</acronym> 環境用、<acronym>PHP</acronym>-GTK 環境用のクラスがあります。