この記事では、Zend Framework チュートリアルの応答オブジェクトのカプセル化 Zend_Controller_Response の使用法について説明します。参考のために皆さんと共有してください。詳細は次のとおりです:
概要
応答オブジェクトは論理的には要求オブジェクトのパートナーであり、その目的はメッセージ本文やメッセージ ヘッダーを収集することであるため、多数の結果を返すことができます。
Zend_Controller_Response 応答オブジェクトの基本実装
§── 返信
│ §── Abstract.php
│ §── Cli.php
│ §── Exception.php
│ §── http.php
│ └── HttpTestCase.php
Zend_Controller_Response_Abstract
リーリーZend_Controller_Response_Http
リーリー一般的な使い方
メッセージヘッダーを含む応答出力を送信したい場合は、sendResponse()を使用します。
リーリー注: デフォルトでは、フロント コントローラーはディスパッチ リクエストの完了後に sendResponse() を呼び出します。これを呼び出す必要はありません。ただし、応答を処理したり、テストに使用したりする場合は、 Zend_Controller_Front::returnResponse(true) を使用して returnResponse フラグを設定することで、デフォルトの動作をオーバーライドできます。 リーリー
アクションコントローラーで応答オブジェクトを使用します。出力を直接レンダリングしてメッセージ ヘッダーを送信する代わりに、結果を応答オブジェクトに書き込みます。リーリー
これにより、コンテンツを表示する前にすべてのメッセージを一度に送信できます。注: アクション コントローラーのビュー統合を使用する場合、対応するオブジェクトでレンダリング ビュー スクリプトを設定する必要はありません。これは Zend_Controller_Action::render() がデフォルトで行うためです。
プログラム内で例外が発生した場合は、応答オブジェクトのisException()フラグを確認し、getException()を使用して例外を取得します。さらに、エラー ページにリダイレクトしたり、例外メッセージをログに記録したり、例外メッセージを美しくフォーマットしたりするカスタム応答オブジェクトを作成することもできます。
応答オブジェクトは、フロントエンド コントローラーがdispatch()を実行した後、またはフロントエンド コントローラーが出力をレンダリングする代わりに応答オブジェクトを返すように要求された後に取得できます。
リーリー
デフォルトでは、例外メッセージは表示されません。デフォルト設定は、renderExceptions() を呼び出すことでオーバーライドできます。または、フロントコントローラーの throwExceptions() を有効にします:リーリー
メッセージヘッダーを処理しています
上で述べたように、応答オブジェクトの重要な役割の 1 つは HTTP 応答ヘッダーを収集して送信することであり、それに応じて多数のメソッドがあります:canSendHeaders() は、メッセージ ヘッダーが送信されたかどうかを判断するために使用されます。このメソッドには、メッセージ ヘッダーの送信時に例外をスローするかどうかを示すオプションのフラグがあります。デフォルト設定は、headersSentThrowsException プロパティを false に設定することでオーバーライドできます。
setHeader($name, $value, $replace = false) は、個々のメッセージ ヘッダーを設定するために使用されます。デフォルトでは、同じ名前の既存のメッセージ ヘッダーは置換されませんが、$replace を true に設定すると置換を強制できます。
メッセージ ヘッダーを設定する前に、このメソッドはまず canSendHeaders() をチェックして操作が許可されているかどうかを確認し、例外のスローを要求します。
setRedirect($url, $code = 302) は、リダイレクトの準備として HTTP ポジショニング ヘッダーを設定します。HTTP ステータス コードが指定されている場合、リダイレクトではそのステータス コードが使用されます。
これは内部で setHeader() を呼び出し、$replace フラグをオンにして、位置決めメッセージ ヘッダーが 1 回だけ送信されるようにします。
getHeaders() はメッセージ ヘッダーの配列を返します。各要素は「name」キーと「value」キーを持つ配列です。
clearHeaders() は、登録されているすべてのキーと値のメッセージ ヘッダーをクリアします。
setRawHeader() は、HTTP ステータス メッセージ ヘッダーなど、キーと値のペアを含まない生のメッセージ ヘッダーを設定します。
getRawHeaders() は、登録されているすべての生のメッセージ ヘッダーを返します。
clearRawHeaders() は、生のメッセージ ヘッダーをすべてクリアします。
clearAllHeaders() は、元のメッセージ ヘッダーとキーと値のメッセージ ヘッダーを含むすべてのメッセージ ヘッダーをクリアします。
名前付きスニペット
対応するオブジェクトは「名前付きフラグメント」をサポートします。メッセージ本文をさまざまなフラグメントに分割し、特定の順序で並べることができます。したがって、出力は特定の順序で返されます。内部的には、本文の内容は配列として保存され、多数のアクセサー メソッドを使用して配列内の位置と名前を示すことができます。たとえば、preDispatch() フックを使用してヘッダーを応答オブジェクトに追加し、次に本文のコンテンツをアクション コントローラーに追加し、最後にフッターを postDispatch() フックに追加できます。
リーリー
上記の例では、/my/foo を呼び出すと、最終的な応答オブジェクトのコンテンツは次の構造になります。 リーリー応答をレンダリングするとき、配列内の要素の順序でレンダリングされます。
名前付きフラグメントを処理するために多数のメソッドを使用できます:
setBody() と appendBody() はどちらも、名前付きフラグメントを示す $name パラメーターを渡すことができます。この引数を指定すると、指定された名前付きフラグメントが存在しない場合は上書きされて作成されます。 $name パラメータが setBody() に渡されない場合、本文の内容全体がリセットされます。 $name 引数が appendBody() に渡されない場合、コンテンツは「デフォルト」の名前付きフラグメントに追加されます。
prepend($name, $content) は、$name という名前のフラグメントを作成し、配列の先頭に配置します。フラグメントが存在する場合は、それが最初に削除されます。
append($name, $content) は、$name という名前のフラグメントを作成し、配列の最後に配置します。 フラグメントが存在する場合は、それが最初に削除されます。
insert($name, $content, $parent = null, $before = false) は、$name という名前のフラグメントを作成します。 $parent パラメータが指定されている場合、新しいフラグメントは $before の値に応じて
に配置されます。
$parentの前または後。フラグメントが存在する場合は、それが最初に削除されます。
clearBody($name = null) $name パラメータが指定されている場合はフラグメントが削除され、そうでない場合はすべて削除されます。
getBody($spec = false) $spec パラメータがフラグメント名の場合、フィールドが取得されます。 $spec パラメータが false の場合、文字列形式の名前付きフラグメントの連続したチェーンが返されます。 $spec パラメータが true の場合、本文のコンテンツ配列を返します。
応答オブジェクトの例外をテストする
上記の通り、デフォルトでは配信処理中の例外はレスポンスオブジェクトに登録されます。例外はヒープに登録されるため、プログラム例外、ディスパッチ例外、プラグイン例外など、すべての例外をスローできます。特定の例外を確認またはログに記録したい場合は、応答オブジェクトの例外 API を使用するとよいでしょう:
setException(Exception $e) 例外を登録します。
isException() は、例外が登録されているかどうかを判断します。
getException() は例外ヒープ全体を返します。
hasExceptionOfType($type) は、特定のクラスの例外がヒープ内にあるかどうかを判断します。
hasExceptionOfMessage($message) は、指定されたメッセージを伴う例外がヒープ内にあるかどうかを判断します。
hasExceptionOfCode($code) は、指定されたコードの例外がヒープ内にあるかどうかを判断します。
getExceptionByType($type) ヒープ内の特定のクラスのすべての例外を取得します。そうでない場合は false を返し、それ以外の場合は配列を返します。
getExceptionByMessage($message) 特定のメッセージを含むヒープ内のすべての例外を取得します。そうでない場合は false を返し、それ以外の場合は配列を返します。
getExceptionByCode($code) 特定のコードを持つヒープ内のすべての例外を取得します。そうでない場合は false を返し、それ以外の場合は配列を返します。
renderExceptions($flag) 応答の送信時に、応答内の例外を送信する必要があるかどうかを示すフラグを設定します。
カスタム応答オブジェクト
応答オブジェクトの目的は、まず、多数のアクションやプラグインからメッセージ ヘッダーとコンテンツを収集し、それらをクライアントに返すことです。次に、応答オブジェクトは、これらを処理または返すために発生する例外も収集します。例外を非表示にするか、エンド ユーザーから例外を非表示にします。
レスポンスの基本クラスは Zend_Controller_Response_Abstract であり、作成されたサブクラスはこのクラスまたはその派生クラスを継承する必要があります。利用可能な多数の方法が前の章でリストされています。
応答オブジェクトをカスタマイズする理由には、返されたコンテンツの出力方法をリクエスト環境に基づいて変更すること (例: CLI および PHP-GTK リクエストでヘッダーを送信しない)、名前付きフラグメントに格納されているコンテンツの最終ビューを返す機能の追加が含まれます。もっと。
より zend 関連のコンテンツに興味のある読者は、このサイトの特別トピックをチェックしてください: 「Zend FrameWork フレームワーク入門チュートリアル」、「php 優れた開発フレームワークの概要」、「Yii フレームワークの紹介と一般的なテクニックの概要」、「ThinkPHP」入門チュートリアル』『PHPオブジェクト指向プログラミング入門チュートリアル』『php+mysqlデータベース操作入門チュートリアル』『php共通データベース操作スキルまとめ』
この記事が PHP プログラミングのすべての人に役立つことを願っています。