====== Slim4 レスポンス ======
Version 4.5.0
--- //[[http://www.y2sunlight.com|y2sunlight]] 2020-09-23//
[[slim:top|Slim に戻る]]
関連記事
* [[slim:4:install|Slim4 インストール]]
* [[slim:4:concepts|Slim4 コンセプト]]
* [[slim:4:request|Slim4 リクエスト]]
* Slim4 レスポンス
* [[slim:4:routing|Slim4 ルーティング]]
* [[slim:4:middleware|Slim4 ミドルウェア]]
* [[slim:4:cookbook|Slim4 クックブック]]
本章は以下のサイトの **The Response** のセクションを翻訳し若干の補足を加えたのもです。
* https://www.slimframework.com/docs/v4/
-----
Slimアプリのルート(route)とミドルウェアには、クライアントに返される現在のHTTPレスポンスを表すPSR-7レスポンスオブジェクトが与えられます。レスポンスオブジェクトは、HTTPレスポンスステータス、ヘッダー、およびボディを検査および操作できる [[https://www.php-fig.org/psr/psr-7/#33-psrhttpmessageresponseinterface|PSR-7 ResponseInterface]] を実装します。
\\
===== Responseオブジェクトを取得する方法 =====
PSR-7レスポンスオブジェクトは、次のようにルート(route)コールバックの2番目の引数としてSlimアプリケーションルートに注入されます。
get('/hello', function (ServerRequest $request, Response $response) {
$response->getBody()->write('Hello World');
return $response;
});
$app->run();
\\
===== レスポンスステータス =====
すべてのHTTPレスポンスには、数値のステータスコードがあります。[[https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html|ステータスコード]] は、クライアントに返されるHTTPレスポンスのタイプを識別します。PSR-7レスポンスオブジェクトのデフォルトのステータスコードは ''200'' (OK) です。以下のように ''getStatusCode()'' メソッドを使用して、PSR-7 Responseオブジェクトのステータスコードを取得できます。
$status = $response->getStatusCode();
PSR-7レスポンスオブジェクトをコピーして、次のような新しいステータスコードを割り当てることができます:
$newResponse = $response->withStatus(302);
\\
===== レスポンスヘッダー =====
全てのHTTPレスポンスにはヘッダーがあります。これらはHTTPレスポンスを説明するメタデータで、レスポンスのボディには表示されません。PSR-7 レスポンスオブジェクトは、そのヘッダーを検査および操作するためのいくつかのメソッドを提供します。
==== 全てのヘッダーを取得する ====
PSR-7 レスポンスオブジェクトの ''getHeaders()'' メソッドを使用して、すべてのHTTPレスポンスヘッダーを連想配列としてフェッチできます。結果として得られる連想配列のキーはヘッダー名であり、その値自体がそれぞれのヘッダー名の文字列値の数値配列です。
$headers = $response->getHeaders();
foreach ($headers as $name => $values) {
echo $name . ": " . implode(", ", $values);
}
\\
==== 1つのヘッダーを取得する ====
PSR-7レスポンスオブジェクトの ''getHeader($name)'' メソッドを使用して、単一のヘッダーの値を取得できます。これにより、指定されたヘッダー名の値の配列が返されます。1つのHTTPヘッダーには複数の値が含まれる場合があることに注意してください。
$headerValueArray = $response->getHeader('Vary');
PSR-7 レスポンスオブジェクトの ''getHeaderLine($name)'' メソッドを使用して、特定のヘッダーのすべての値を含むコンマ区切りの文字列をフェッチすることもできます。''getHeader($name)'' メソッドとは異なり、このメソッドはコンマで区切られた文字列を返します。
$headerValueString = $response->getHeaderLine('Vary');
\\
==== ヘッダーを検出する ====
PSR-7 レスポンスオブジェクトの ''hasHeader($name)'' メソッドを使用して、ヘッダーの存在をテストできます。
if ($response->hasHeader('Vary')) {
// Do something
}
\\
==== ヘッダーをセットする ====
PSR-7 レスポンスオブジェクトの ''withHeader($name, $value)'' メソッドを使用してヘッダー値を設定できます。
$newResponse = $oldResponse->withHeader('Content-type', 'application/json');
>**注意**
>Responseオブジェクトは不変です。このメソッドは、新しいヘッダー値を持つResponseオブジェクトのコピーを返します。このメソッドは破壊的であり、同じヘッダー名にすでに関連付けられている既存のヘッダー値を置き換えます。
\\
==== ヘッダーを追加する ====
PSR-7 Responseオブジェクトの ''withAddedHeader($name、$value)'' メソッドを使用してヘッダー値を追加できます。
$newResponse = $oldResponse->withAddedHeader('Allow', 'PUT');
> **注意**
> withHeader() メソッドとは異なり、このメソッドは、同じヘッダー名として既に存在する値のセットに新しい値を追加します。Response オブジェクトは不変です。このメソッドは、ヘッダー値が追加されたResponseオブジェクトのコピーを返します。
\\
==== ヘッダーを削除する ====
Responseオブジェクトの ''withoutHeader($name)'' メソッドを使用してヘッダーを削除できます。
$newResponse = $oldResponse->withoutHeader('Allow');
> **リマインダー**
> Responseオブジェクトは不変です。 このメソッドは、ヘッダー値を削除したResponseオブジェクトのコピーを返します。
\\
===== レスポンスボディ =====
HTTPレスポンスには通常、ボディがあります。
PSR-7 Requestオブジェクトと同様に、PSR-7 Responseオブジェクトはボディを ''Psr\Http\Message\StreamInterface'' のインスタンスとして実装します。PSR-7 Responseオブジェクトの ''getBody()'' メソッドを使用して、HTTPレスポンスボディの ''StreamInterface'' インスタンスを取得できます。''getBody()'' メソッドは、発信HTTPレスポンスの長さが不明であるか、使用可能なメモリに対して大きすぎる場合に適しています。
$body = $response->getBody();
結果として得られる ''Psr\Http\Message\StreamInterface'' インスタンスは、基礎となるPHPの ''resource'' からの読み取り、反復、および書き込みを行うための次のメソッドを提供します。
* getSize()
* tell()
* eof()
* isSeekable()
* seek()
* rewind()
* isWritable()
* write($string)
* isReadable()
* read($length)
* getContents()
* getMetadata($key = null)
ほとんどの場合、PSR-7 Responseオブジェクトには書き込む必要があります。次のように、''write()'' メソッドを使用して ''StreamInterface'' インスタンスにコンテンツを書き込むことができます:
$body = $response->getBody();
$body->write('Hello');
PSR-7 Responseオブジェクトのボディをまったく新しい ''StreamInterface'' インスタンスに置き換えることもできます。
これは、コンテンツをリモートの宛先(例えば、ファイルシステムやリモートAPIなど)からHTTPレスポンスにパイプ処理する場合に特に便利です。PSR-7 Responseオブジェクトのボディを ''withBody(StreamInterface $body)'' メソッドを使って置き換えることができます。 その引数は、''Psr\Http\Message\StreamInterface'' のインスタンスでなければなりません( ''MUST'' )。
use GuzzleHttp\Psr7\LazyOpenStream;
$newStream = new LazyOpenStream('/path/to/file', 'r');
$newResponse = $oldResponse->withBody($newStream);
> **注意**
> Responseオブジェクトは不変です。このメソッドは、新しい本文を含むResponseオブジェクトのコピーを返します。
\\
===== JSONを返す =====
最も単純な形式では、JSONデータはデフォルトの 200 HTTPステータスコードを使用して返すことができます。
$data = array('name' => 'Bob', 'age' => 40);
$payload = json_encode($data);
$response->getBody()->write($payload);
return $response
->withHeader('Content-Type', 'application/json');
カスタムHTTPステータスコードを使用してJSONデータを返すこともできます。
$data = array('name' => 'Rob', 'age' => 40);
$payload = json_encode($data);
$response->getBody()->write($payload);
return $response
->withHeader('Content-Type', 'application/json')
->withStatus(201);
>The Response object is immutable. This method returns a copy of the Response object that has a new Content-Type header. This method is destructive, and it replaces the existing Content-Type header.
> **注意**
> Responseオブジェクトは不変です。このメソッドは、新しいContent-Typeヘッダーを持つResponseオブジェクトのコピーを返します。このメソッドは破壊的であり、既存のContent-Typeヘッダーを置き換えます。
\\
===== リダイレクトを返す =====
Locationヘッダーを使用して、HTTPクライアントをリダイレクトできます。
return $response
->withHeader('Location', 'https://www.example.com')
->withStatus(302);
\\