レスポンスオブジェクト使用法レスポンスオブジェクトは、 リクエストオブジェクト と対になるものです。 その目的は、コンテンツやヘッダを収集し、それを返すことです。 さらに、フロントコントローラで捕捉した例外はすべてレスポンスオブジェクトに渡されます。 これにより、例外の処理がやりやすくなります。 この挙動を変更するには Zend_Controller_Front::throwExceptions(true) と設定します。
ヘッダを含むレスポンス出力を送信するには、 sendResponse() を使用します。
開発者は、アクションコントローラの中でレスポンスオブジェクトを使用しなければなりません。 出力を直接レンダリングしたり直接ヘッダを送信したりするのではなく、 それらをレスポンスオブジェクトに格納するようにします。
こうすることで、すべてのヘッダを一度に送信し、 その後でコンテンツを表示することができます。
アプリケーションで例外が発生したかどうかを調べるには、 レスポンスオブジェクトの isException() フラグを調べます。例外を取得するには getException() を使用します。さらに、独自のレスポンスオブジェクトを作成して、 エラーページへのリダイレクトや例外メッセージのログ出力、 例外をわかりやすく表示する (開発用) などを行うことができます。 レスポンスオブジェクトは、フロントコントローラの dispatch() から受け取ることになります。あるいは、 出力のレンダリングを行わない状態のレスポンスオブジェクトを フロントコントローラから受け取ることもできます。
デフォルトでは、例外メッセージは表示されません。 この挙動をオーバーライドするには renderExceptions() メソッドを使用するか、あるいは上で示したようにフロントコントローラで throwExceptions() を有効にします。
ヘッダの操作先ほど説明したように、レスポンスオブジェクトの役割のひとつは HTTP レスポンスヘッダを発行することです。 このために、さまざまなメソッドが用意されています。
これらのメソッドのほかに、現在のリクエストの HTTP レスポンスコードを設定したり取得したりするメソッドとして setHttpResponseCode() と getHttpResponseCode() が用意されています。 クッキーのヘッダーを設定You can inject HTTP Set-Cookie headers into the response object of an action controller by using the provided header class Zend_Http_Header_SetCookie コンストラクタの引数The following table lists all constructor arguments of Zend_Http_Header_SetCookie in the order they are accepted. All arguments are optional, but name and value must be supplied via their setters if not passed in via the constructor or the resulting Set-Cookie header be invalid.
Example #1 Populate Zend_Http_Header_SetCookie via constructor and add to response
Example #2 Populate Zend_Http_Header_SetCookie via setters and add to response
名前つきセグメントレスポンスオブジェクトでは「名前つきセグメント」をサポートしています。 これにより、本文部だけを別のセグメントに切り分けて、 指定した順序で出力したりといったことができるようになります。 内部的にはコンテンツは配列として保存され、 さまざまなメソッドを使用してその配列にアクセスできるようになります。 例として、 preDispatch() フックメソッドで レスポンスオブジェクトにヘッダを追加し、 アクションコントローラで本文を追加して、 最後に postDispatch() フックメソッドでフッタを追加することを考えてみましょう。
上の例で /my/foo をコールすると、 レスポンスオブジェクトに最終的に格納されるコンテンツは次のようになります。
これをレンダリングすると、配列に要素が追加された順に表示されます。 名前つきセグメントを操作するメソッドには、以下のようなものがあります。
レスポンスオブジェクト内での例外の検査先ほど説明したように、デフォルトでは ディスパッチ中に発生した例外はレスポンスオブジェクトに登録されます。 例外はスタックに登録されるので、発生した例外はすべて保持することができます。 アプリケーションの例外、ディスパッチ処理の例外、プラグインの例外などなど……。 特定の例外の内容を調べたり例外をログに記録したりしたい場合は、 レスポンスオブジェクトの例外用 API を使用します。
レスポンスオブジェクトのサブクラスの作成レスポンスオブジェクトの役割は、 さまざまなアクションやプラグインからヘッダやコンテンツを収集し、 それをクライアントに返すことです。 さらに、処理中に発生したエラーの内容も収集します。 これはそのまま返すこともありますし、あるいはユーザから見えないように隠すこともあります。 レスポンスクラスの基底クラスは Zend_Controller_Response_Abstract です。レスポンスクラスを作成する際には、 このクラスあるいはその派生クラスのいずれかを継承しなければなりません。 このクラスが提供するメソッドについては、先ほど説明しました。 レスポンスオブジェクトのサブクラスを作成する理由としては、 リクエストされた環境に応じて出力内容を変えたり (たとえば CLI や PHP-GTK の場合はヘッダを送信しないなど) 名前つきセグメントに保存された内容の最終結果を返す機能を追加したりといったことが考えられます。
|