目次

Slim4 レスポンス

Version 4.5.0

y2sunlight 2020-09-23

Slim に戻る

関連記事

本章は以下のサイトの The Response のセクションを翻訳し若干の補足を加えたのもです。


Slimアプリのルート(route)とミドルウェアには、クライアントに返される現在のHTTPレスポンスを表すPSR-7レスポンスオブジェクトが与えられます。レスポンスオブジェクトは、HTTPレスポンスステータス、ヘッダー、およびボディを検査および操作できる PSR-7 ResponseInterface を実装します。


Responseオブジェクトを取得する方法

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);
}


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 からの読み取り、反復、および書き込みを行うための次のメソッドを提供します。

ほとんどの場合、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);