リクエストオブジェクト導入リクエストオブジェクトとは Zend_Controller_Front とルータ、 ディスパッチャそしてコントローラクラスの間でやり取りされる単純なバリューオブジェクトです。 これはコントローラ、アクションそして環境 (HTTP、CLI、PHP-GTK など) に応じたその他のパラメータの内容をまとめたものです。
リクエストの型によっては、その他のメソッドが使用できることもあります。 たとえば、デフォルトのリクエストで使用する Zend_Controller_Request_Http の場合は、 リクエストされた URI やパス情報、 $_GET パラメータや $_POST パラメータを取得するメソッドが使用可能となります。 リクエストオブジェクトはフロントコントローラに渡されます。 もしリクエストオブジェクトがなかった場合は、 ディスパッチ処理の最初 (ルーティングが発生する前) にインスタンスが作成されます。これは、 ディスパッチチェインのすべてのオブジェクトに渡されていきます。 さらに、リクエストオブジェクトはテストの際にも有用です。 開発者がリクエストを作成し、コントローラやアクション、 パラメータや URI などを指定してそれをフロントコントローラに渡すことで、 アプリケーションの流れをテストできます。 レスポンスオブジェクト と組み合わせて使用すると、 MVC アプリケーションの精密で正確な単体テストが可能となります。 HTTP リクエストリクエストデータへのアクセスZend_Controller_Request_Http は、関連する値へのアクセスをカプセル化します。 たとえばコントローラやアクションルータの変数のキー名や値、 URI からパースした追加のパラメータの値などにアクセスできます。 Zend_Controller_Request_Http のプロキシとして動作することで、 スーパーグローバルの値にパブリックメンバとしてアクセスしたり、 現在のベース URL やリクエスト URI を管理することもできます。 スーパーグローバルの値はリクエストオブジェクトに設定することはできません。 そのかわりに setParam() および getParam() メソッドを使用して、 パラメータを設定あるいは取得します。
特定のスーパーグローバルにアクセスするには、 パブリックメソッドを使用する方法もあります。たとえば、 $_POST['user'] の値を取得するには、リクエストオブジェクト上で getPost('user') をコールします。同様に、 $_GET 要素の場合は getQuery()、 リクエストヘッダの場合は getHeader() を使用します。
ユーザパラメータをリクエストオブジェクトに設定するには setParam() を、後でそれを取得するには getParam() を使用します。 ルータは、リクエスト URI にマッチしたパラメータを リクエストオブジェクトに設定する際にこの機能を使用します。
ベース URL およびサブディレクトリZend_Controller_Request_Http は、 サブディレクトリで Zend_Controller_Router_Rewrite を使用できます。 Zend_Controller_Request_Http は自動的にベース URL を検出し、 それを適切に設定します。 たとえば、index.php をウェブサーバのサブディレクトリ /projects/myapp/index.php においた場合は、ベース URL (rewrite base) は /projects/myapp にしなければなりません。 マッチするルートを見つける前に、この文字列がパスの先頭から取り除かれます。 これにより、すべてのルートに余計な文字を追加する必要がなくなります。 ルート 'user/:username' は、 http://localhost/projects/myapp/user/martel および http://example.com/user/martel の両方にマッチするようになります。
ベース URL の検出に失敗する場合は、 Zend_Controller_Request_Http クラス、あるいは Zend_Controller_Front クラスの setBaseUrl() メソッドを使用して ベースパスを上書き指定できます。 一番簡単な方法は Zend_Controller_Front で設定することです。 この設定はリクエストオブジェクトに引き継がれます。 独自のベース URL を設定する例を示します。
リクエストメソッドの判定getMethod() では、 現在のリソースへのリクエストの際に使用した HTTP メソッドを判定できます。 さらに、指定した型のリクエストであったかどうかを判定するための メソッドも用意されています。
これらの主な使用法は、RESTfult な MVC アーキテクチャを作成することです。 AJAX リクエストの検出Zend_Controller_Request_Http には、 AJAX リクエストを検出するための基本的なメソッド isXmlHttpRequest() が用意されています。 このメソッドは、HTTP リクエストヘッダ X-Requested-With に 'XMLHttpRequest' という値が設定されているかどうかを調べ、 設定されている場合に TRUE を返します。 現時点では、次の JS ライブラリがデフォルトでこのヘッダを渡すようです。
大半の AJAX ライブラリは、独自の HTTP リクエストヘッダを送信できます。 ご利用のライブラリがこのヘッダを送信していない場合は、 自分でこのヘッダを追加することで isXmlHttpRequest() メソッドの動作を期待通りにできます。 リクエストオブジェクトのサブクラスの作成すべてのリクエストオブジェクトクラスは、抽象クラス Zend_Controller_Request_Abstract を継承しています。 このクラスでは、次のようなメソッドを定義しています。
リクエストオブジェクトは、リクエスト環境のコンテナとなります。 コントローラチェインが知っておくべきことは、 コントローラやアクション、オプションパラメータ、ディスパッチ状況 を取得したり設定したりする方法だけです。 デフォルトでは、リクエストオブジェクトが コントローラおよびアクションを決定する際には キー controller あるいは action を使用します。 このクラスかその派生クラスのいずれかを継承したクラスを作成することで、 上で説明した作業を独自のものに変更したクラスを作成できます。 例としては、たとえば HTTP 環境用 のクラスや CLI 環境用、PHP-GTK 環境用のクラスがあります。
|