Version 4.5.0
— y2sunlight 2020-09-23
関連記事
本章は以下のサイトの The Response のセクションを翻訳し若干の補足を加えたのもです。
Slimアプリのルート(route)とミドルウェアには、クライアントに返される現在のHTTPレスポンスを表すPSR-7レスポンスオブジェクトが与えられます。レスポンスオブジェクトは、HTTPレスポンスステータス、ヘッダー、およびボディを検査および操作できる PSR-7 ResponseInterface を実装します。
PSR-7レスポンスオブジェクトは、次のようにルート(route)コールバックの2番目の引数としてSlimアプリケーションルートに注入されます。
<?php use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use Slim\Factory\AppFactory; require __DIR__ . '/../vendor/autoload.php'; $app = AppFactory::create(); $app->get('/hello', function (ServerRequest $request, Response $response) { $response->getBody()->write('Hello World'); return $response; }); $app->run();
すべてのHTTPレスポンスには、数値のステータスコードがあります。ステータスコード は、クライアントに返される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); }
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
からの読み取り、反復、および書き込みを行うための次のメソッドを提供します。
ほとんどの場合、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データはデフォルトの 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);