1. Home
  2. PHP
  3. PSR
  4. 【PHP】PSR-7 HTTP message interfaces(HTTPメッセージインターフェイス)

【PHP】PSR-7 HTTP message interfaces(HTTPメッセージインターフェイス)

  • 公開日
  • 更新日
  • カテゴリ:PSR
  • タグ:PHP,PSR,PSR-7,PSR-17
【PHP】PSR-7 HTTP message interfaces(HTTPメッセージインターフェイス)

PSR(PHP 標準勧告)

  1. 概要
  2. PSR-1 Basic Coding Standard
  3. PSR-2 Coding Style Guide
  4. PSR-3 Logger Interface
  5. PSR-4 Autoloader
  6. PSR-6 Caching Interface
  7. PSR-7 HTTP Message Interface
  8. PSR-11 Container Interface
  9. PSR-12 Extended Coding Style
  10. PSR-13 Hypermedia Links
  11. PSR-15 HTTP Handlers
  12. PSR-16 Simple Cache
  13. PSR-17 HTTP Factories
  14. PSR-18 HTTP Client

PSR-7 では、RFC 7230RFC 7231 で説明されているように HTTP メッセージを表すための一般的なインターフェイスと、RFC 3986 で説明されているように、HTTP メッセージで使用する URI について説明します。

Contents

  1. HTTP メッセージ
  2. 仕様
    1. メッセージ
    2. HTTP Headers
  3. パッケージ
  4. インターフェイス
    1. MessageInterface
    2. RequestInterface
    3. ServerRequestInterface
    4. ResponseInterface
    5. StreamInterface
    6. UriInterface
    7. UploadedFileInterface

HTTP メッセージ

HTTP メッセージは、サーバとクライアントとのデータ交信手段の事です。クライアントからサーバへのリクエストと、サーバからクライアントへのレスポンスの 2 種類があります。

HTTP メッセージは Web開発の基礎です。 Web ブラウザと cURL などの HTTP クライアントは、HTTP レスポンスメッセージを生成する Web サーバーに送信される HTTP リクエストメッセージを作成します。 サーバー側コードは HTTP リクエストメッセージを受信し、HTTP レスポンスメッセージを返します。

HTTP メッセージは、通常、エンドユーザーのコンシューマから抽象化されますが、開発者は、HTTP API にリクエストを送信しているかどうかにかかわらず、一般的に、それらがどのように構造化されているか、または着信リクエストを処理することができます。

すべての HTTP リクエストメッセージには、特定の形式があります。

POST /path HTTP/1.1
Host: example.com

foo=bar&baz=bat

リクエストの最初の行は「リクエスト行」であり、HTTP リクエストメソッド、リクエストターゲット(通常は絶対 URI または Web サーバー上のパス)と HTTP プロトコルのバージョンが順番に含まれています。 これに続いて、1 つまたは複数の HTTP ヘッダー、空の行、およびメッセージ本文が続きます。

HTTP レスポンスメッセージの構造も同様です。

HTTP/1.1 200 OK
Content-Type: text/plain

This is the response body

最初の行は「ステータスライン」であり、HTTP プロトコルバージョン、HTTP ステータスコード、および人間が判読可能なステータスコードの説明である「理由フレーズ」が順番に含まれています。 リクエストメッセージと同様に、1 つ以上の HTTP ヘッダー、空の行、およびメッセージ本文が続きます。

PSR-7 で説明されているインタフェースは、HTTP メッセージとそれを構成する要素に関する抽象です。

仕様

以下、HTTP メッセージの仕様について説明します。尚、インタフェースを表記するときには、名前空間 Psr\Http\Message は省略されます。つまり、インターフェイスの名前空間は

namespace Psr\Http\Message;

となります。

メッセージ

HTTP メッセージは、クライアントからサーバーへのリクエストか、サーバーからクライアントへのレスポンスです。 この仕様では、HTTP メッセージ RequestInterfaceResponseInterface のインターフェイスをそれぞれ定義しています。

RequestInterfaceResponseInterface の両方が MessageInterface を拡張します。 MessageInterface は直接実装することができますが、実装者は RequestInterfaceResponseInterface を実装する必要があります。

  • MessageInterface
    • RequestInterface
    • ResponseInterface

HTTP Headers

以下、HTTP ヘッダーについての記述です。

大文字と小文字を区別しないヘッダーフィールド名

HTTP メッセージには大文字と小文字を区別しないヘッダーフィールド名が含まれます。 ヘッダーは、MessageInterface を実装するクラスの名前で大文字小文字を区別せずに取得されます。 たとえば、foo ヘッダーを取得すると、FoO ヘッダーを取得するのと同じ結果が返されます。 同様に、Foo ヘッダーを設定すると、以前に設定された foo ヘッダー値が上書きされます。

$message = $message->withHeader('foo', 'bar');

echo $message->getHeaderLine('foo');
// Outputs: bar

echo $message->getHeaderLine('FOO');
// Outputs: bar

$message = $message->withHeader('fOO', 'baz');
echo $message->getHeaderLine('foo');
// Outputs: baz

大文字と小文字を区別せずにヘッダを検索することができるにもかかわらず、特に getHeaders() で取得した場合は、実装によって元のケースを保持する必要があります。

準拠していない HTTP アプリケーションは、特定のケースに依存する可能性があるため、ユーザーがリクエストまたはレスポンスを作成するときに HTTP ヘッダーの大文字小文字を指定できるようにすると便利です。

複数の値を持つヘッダ

複数の値を持つヘッダーに対応するにもかかわらず、ヘッダーを文字列として扱う利便性を提供するために、MessageInterface のインスタンスからヘッダーを配列または文字列として取り出すことができます。 getHeaderLine() メソッドを使用して、コンマで連結した名前で、大文字小文字を区別しないヘッダーのすべてのヘッダー値を含む文字列としてヘッダー値を取得します。 特定の大文字と小文字を区別しないヘッダーのすべてのヘッダー値の配列を名前で取得するには、getHeader() を使用します。

$message = $message
    ->withHeader('foo', 'bar')
    ->withAddedHeader('foo', 'baz');

$header = $message->getHeaderLine('foo');
// $header contains: 'bar, baz'

$header = $message->getHeader('foo');
// ['bar', 'baz']

注:すべてのヘッダー値をコンマ(たとえば、Set-Cookie)を使用して連結できるわけではありません。 このようなヘッダーを扱う場合、MessageInterface ベースのクラスのコンシューマーは、そのような複数の値のヘッダーを取得するために getHeader() メソッドに依存する必要があります。

ホストヘッダー

リクエストでは、Host ヘッダーは通常、URI のホストコンポーネントと、TCP 接続を確立するときに使用されるホストをミラーリングします。 ただし、HTTP 仕様では、Host ヘッダーがそれぞれのヘッダーと異なることがあります。

構築中、実装は、Host ヘッダが提供されていなければ、提供された URI から Host ヘッダを設定しようとする必要があります。

RequestInterface::withUri() は、デフォルトで、返されたリクエストの Host ヘッダを、渡された UriInterface のホストコンポーネントと一致する Host ヘッダで置き換えます。

2 番目の( $preserveHost)引数に true を渡すことで、Host ヘッダーの元の状態を保持するようにオプトインできます。 この引数が true に設定されている場合、メッセージにホストヘッダーが含まれていない限り、返されたリクエストは返されたメッセージの Host ヘッダーを更新しません。

この表は、様々な初期リクエストと URI に対して $preserveHost 引数が true に設定された状態で、withUri() によって返されたリクエストに対して getHeaderLine('Host') が返すものを示しています。

REQUEST HOST HEADER1REQUEST HOST HEADER2URI HOST COMPONENT3RESULT
----
-foo.com-foo.com
-foo.combar.comfoo.com
foo.com-bar.comfoo.com
foo.combar.combaz.comfoo.com
  1. 操作前のホストヘッダーの値。
  2. 操作前のリクエストで構成された URI のホストコンポーネント。
  3. URI のホストコンポーネントは、withUri() によって注入されます。

ストリーム

HTTP メッセージは、開始行、ヘッダー、および本文で構成されます。

HTTP メッセージの本文は、小さくても大きくてもかまいませんが、メッセージの本文を文字列として表現しようとすると、本文がメモリに完全に格納されているため、意図したより多くのメモリを簡単に消費する可能性があります。リクエストまたはレスポンスの本体をメモリに格納しようとすると、その実装を使用して大きなメッセージ本文を扱うことができなくなります。

StreamInterface は、データのストリームを読み書きするときの実装の詳細を隠すために使用されます。文字列が適切なメッセージ実装である状況では、php://memoryphp://temp などの組み込みストリームを使用できます。

StreamInterface では、ストリームの読み込み、書き込み、および通過を効率的に行うためのいくつかのメソッドが公開されています。

ストリームは、isReadable(), isWritable(), および isSeekable() の 3 つのメソッドを使用して、機能を公開します。これらのメソッドは、ストリーム共同作業者がストリームがその要件を満たすことができるかどうかを判断するために使用できます。

各ストリームインスタンスには、読み取り専用、書き込み専用、または読み書き可能なさまざまな機能があります。また、任意のランダムアクセス(前方または後方へのシーク)、またはシーケンシャルアクセス(たとえば、ソケット、パイプ、またはコールバックベースのストリームの場合)のみを許可することもできます。

最後に、StreamInterface__toString() メソッドを定義して、本文のコンテンツ全体を一度に取得または送出する作業を簡素化します。

RequestInterfaceResponseInterface とは異なり、StreamInterface は不変性をモデル化しません。実際の PHP ストリームがラップされる状況では、リソースとやりとりするコードがカーソルの位置や内容などの状態を変更する可能性があるため、不変性を強制することはできません。実装では、サーバー側のリクエストとクライアント側のレスポンスに読み取り専用のストリームを使用することをお勧めします。実装者は、ストリームインスタンスが変更可能であり、メッセージの状態を変更する可能性があるという事実に注意する必要があります。不確かな場合は、新しいストリームインスタンスを作成し、それをメッセージに添付して状態を強制します。

リクエストのターゲットと URI

RFC 7230 によれば、リクエストメッセージはリクエストラインの第 2 セグメントとして「リクエスト - ターゲット」を含む。 リクエストのターゲットは、次のいずれかの形式にすることができます。

  • 基本形式(origin-form)
    • パスとクエリ文字列(存在する場合)からなります。これは相対 URL とも呼ばれます。 TCP を介して送信されるメッセージは典型的には元の形式です。 スキームと権限データは通常、CGI 変数を介してのみ存在します。
  • 絶対形式(absolute-form)
    • パス(存在する場合)、クエリー文字列(存在する場合)、およびフラグメント(存在する場合)が含まれているスキーム、権限(「[user-info@]host[port]」の書式)で構成されます。 これは、絶対 URI と呼ばれることが多く、RFC 3986 で詳述されているように URI を指定する唯一の形式です。この形式は、HTTP プロキシにリクエストするときによく使用されます。
  • 権限形式(authority-form)
    • 権限のみで構成されています。 これは、通常、HTTP クライアントとプロキシサーバー間の接続を確立するために、接続リクエストでのみ使用されます。
  • アスタリスク形式(asterisk-form)
    • これは文字列 *(アスタリスク) のみで構成され、OPTIONS メソッドとともに使用されて Web サーバーの一般的な機能を決定します。 これらのリクエスト対象のほかに、リクエスト対象とは別の有効な URL が存在することがよくあります。有効な URL は HTTP メッセージ内では送信されませんが、リクエストを行うためのプロトコル(http/https)、ポート、およびホスト名を決定するために使用されます。

有効な URL は UriInterface で表されます。 UriInterface は、RFC 3986(プライマリユースケース)で指定されている HTTP および HTTPS URI をモデル化します。このインタフェースは、さまざまな URI パーツとやりとりするためのメソッドを提供します。これにより、URI の繰り返し解析が不要になります。また、モデル化された URI を文字列表現にキャストするための __toString() メソッドも指定します。

getRequestTarget() で request-target を取得する場合、デフォルトではこのメソッドは URI オブジェクトを使用し、必要なすべてのコンポーネントを抽出して origin-form を構築します。基本形式は、最も一般的なリクエストターゲットです。

エンドユーザーが他の 3 つのフォームのいずれかを使用することが望ましい場合、またはユーザーが request-target を明示的にオーバーライドしたい場合、withRequestTarget() を使用してこれを行うことができます。

このメソッドを呼び出すと、getUri() から返される URI には影響しません。

たとえば、ユーザーはサーバーにアスタリスク形式のリクエストを行うことができます。

$request = $request
    ->withMethod('OPTIONS')
    ->withRequestTarget('*')
    ->withUri(new Uri('https://example.org/'));

この例では、最終的に次のような HTTP リクエストが発生する可能性があります。

OPTIONS * HTTP/1.1

しかし、HTTP クライアントは、有効な URL(getUri() から)を使用して、プロトコル、ホスト名、および TCP ポートを判別できます。

HTTP クライアントは、Uri::getPath() および Uri::getQuery() の値を無視し、代わりに getRequestTarget() によって返された値を使用する必要があります。デフォルトでは、これらの 2 つの値が連結されます。

4 つのリクエスト対象フォームのうち 1 つ以上を実装しないことを選択したクライアントは、引き続き getRequestTarget() を使用する必要があります。これらのクライアントは、サポートしていないリクエストターゲットを拒否しなければならず、getUri() の値に戻ってはなりません。

RequestInterface には、request-target を取得するメソッドまたは提供された request-target を使用して新しいインスタンスを作成するメソッドが用意されています。デフォルトでは、request-target がインスタンス内で具体的に構成されていない場合、getRequestTarget() は合成された URI の元の形式を返します(URI が構成されていない場合は "/")。

withRequestTarget($requestTarget) は、指定された request-target を持つ新しいインスタンスを作成し、開発者が他の 3 つのリクエスト対象フォーム(絶対形式、権限形式、およびアスタリスク形式)を表すリクエストメッセージを作成できるようにします。これを使用すると、合成された URI インスタンスは、特にクライアントへの接続に使用される可能性があります。

サーバー側リクエスト

RequestInterface は、HTTP リクエストメッセージの一般的な表現を提供します。 ただし、サーバー側のリクエストのために、サーバー側のリクエストには追加の処理が必要です。 サーバー側の処理では、Common Gateway Interface(CGI)、具体的には PHP のサーバー API(SAPI)を介した CGI の抽象化と拡張を考慮する必要があります。 PHP は、次のようなスーパーグローバルな入力マーシャリングを単純化しました。

  • $_COOKIE
    • デシリアライズし、HTTP Cookie に簡単にアクセスできます。
  • $_GET
    • デシリアライズし、クエリ文字列引数への簡略化されたアクセスを提供します。
  • $_POST
    • デシリアライズし、HTTP POST を介して送信された URL エンコードされたパラメータの簡略化されたアクセスを提供します。 一般的には、メッセージ本体の解析結果と見なすことができます。
  • $_FILES
    • ファイルアップロードに関する一連のメタデータを提供します。
  • $_SERVER
    • これは、一般にリクエストメソッド、リクエストスキーム、リクエスト URI, およびヘッダーを含む CGI/SAPI 環境変数へのアクセスを提供します。

ServerRequestInterface は、RequestInterface を拡張して、これらのさまざまなスーパーグローバルを抽象化します。 この習慣は、実装者によるスーパーグローバルへの結合を減らすのに役立ち、リクエスト実装者をテストする能力を奨励し促進します。

サーバーリクエストには、実装者がアプリケーション固有のルール(パス・マッチング、スキーム・マッチング、ホスト・マッチングなど)に対してイントロスペクション、分解、照合する機能を追加するための属性「属性」が 1 つ追加されています。 したがって、サーバリクエストは、複数のリクエストコンシューマ間でメッセージングを提供することもできます。

ファイルアップロード

ServerRequestInterface は、正規化された構造のアップロードファイルのツリーを取得するメソッドを指定します。各リーフは UploadedFileInterface のインスタンスです。

$_FILES スーパーグローバルには、ファイル入力の配列を処理する際によくある問題があります。 例として、入力ファイル "files"、ファイル[0]とファイル[1]の提出など、ファイルの配列を提出するフォームがある場合、PHP はこれを次のように表します。

array(
    'files' => array(
        'name' => array(
            0 => 'file0.txt',
            1 => 'file1.html',
        ),
        'type' => array(
            0 => 'text/plain',
            1 => 'text/html',
        ),
        /* etc. */
    ),
)

array(
    'files' => array(
        0 => array(
            'name' => 'file0.txt',
            'type' => 'text/plain',
            /* etc. */
        ),
        1 => array(
            'name' => 'file1.html',
            'type' => 'text/html',
            /* etc. */
        ),
    ),
)

その結果、実装者はこの言語実装の詳細を知る必要があり、与えられたアップロードのためのデータを収集するためのコードを書く必要があります。

さらに、ファイルのアップロードが発生したときに $_FILES が設定されないシナリオが存在します。

  • HTTP メソッドが POST でない場合。
  • ユニットテストのとき。
  • ReactPHP など、SAPI 以外の環境で操作する場合。

そののような場合、データは別々にシードされる必要があります。

  • プロセスはメッセージの本文を解析して、ファイルのアップロードを検出します。このような場合、実装は、ファイルアップロードをファイルシステムに書き込まず、ストリームにラップしてメモリ、I/O, ストレージのオーバーヘッドを削減することができます。
  • 単体テストのシナリオでは、異なるシナリオを検証して検証するために、ファイルアップロードのメタデータをスタブおよび/または模擬することができる必要があります。

getUploadedFiles() はコンシューマの正規化構造を提供します。実装は次のように期待されます。

  • 与えられたファイルアップロードに関するすべての情報を集め、それを使って UploadedFileInterface インスタンスを生成します。
  • ツリー内の指定された場所の適切な UploadedFileInterface インスタンスである各リーフで、送信されたツリー構造を再作成します。

参照されるツリー構造は、ファイルが提出された命名構造を模倣する必要があります。

最も簡単な例では、これは以下のように提出された単一の名前付きフォーム要素です。

<input type="file" name="avatar" />

この場合、 $_FILES の構造は次のようになります。

array(
    'avatar' => array(
        'tmp_name' => 'phpUxcOty',
        'name' => 'my-avatar.png',
        'size' => 90996,
        'type' => 'image/png',
        'error' => 0,
    ),
)

getUploadedFiles() によって返される正規化された形式は、次のようになります。

array(
    'avatar' => /* UploadedFileInterface instance */
)

名前に配列表記を使用した入力の場合

<input type="file" name="my-form[details][avatar]" />

$_FILES は次のようになります。

array(
    'my-form' => array(
        'details' => array(
            'avatar' => array(
                'tmp_name' => 'phpUxcOty',
                'name' => 'my-avatar.png',
                'size' => 90996,
                'type' => 'image/png',
                'error' => 0,
            ),
        ),
    ),
)

getUploadedFiles() によって返される対応するツリーは、次のようになります。

array(
    'my-form' => array(
        'details' => array(
            'avatar' => /* UploadedFileInterface instance */
        ),
    ),
)

場合によっては、ファイルの配列を指定することもできます。

Upload an avatar: <input type="file" name="my-form[details][avatars][]" />
Upload an avatar: <input type="file" name="my-form[details][avatars][]" />

例として、JavaScript コントロールは複数のファイルを一度にアップロードできるように追加のファイルアップロード入力を生成することがあります。

そのような場合、仕様実装は、指定されたインデックスのファイルに関連するすべての情報を集約する必要があります。 理由は $_FILES がそのような場合に通常の構造から逸脱しているからです

array(
    'my-form' => array(
        'details' => array(
            'avatars' => array(
                'tmp_name' => array(
                    0 => '...',
                    1 => '...',
                    2 => '...',
                ),
                'name' => array(
                    0 => '...',
                    1 => '...',
                    2 => '...',
                ),
                'size' => array(
                    0 => '...',
                    1 => '...',
                    2 => '...',
                ),
                'type' => array(
                    0 => '...',
                    1 => '...',
                    2 => '...',
                ),
                'error' => array(
                    0 => '...',
                    1 => '...',
                    2 => '...',
                ),
            ),
        ),
    ),
)

上記の $_FILES配列は、getUploadedFiles() によって返される次の構造体に対応します。

array(
    'my-form' => array(
        'details' => array(
            'avatars' => array(
                0 => /* UploadedFileInterface instance */,
                1 => /* UploadedFileInterface instance */,
                2 => /* UploadedFileInterface instance */,
            ),
        ),
    ),
)

以下を使用してネストされた配列のインデックス 1 にアクセスします。

$request->getUploadedFiles()['my-form']['details']['avatars'][1];

アップロードされたファイルデータは派生型( $ _FILES またはリクエスト本体から派生)なので、インタフェースにはミューテータメソッド withUploadedFiles() も存在し、別のプロセスへの正規化の委任が可能です。

元の例の場合、実装は次のようになります。

$file0 = $request->getUploadedFiles()['files'][0];
$file1 = $request->getUploadedFiles()['files'][1];

printf(
    "Received the files %s and %s",
    $file0->getClientFilename(),
    $file1->getClientFilename()
);

// "Received the files file0.txt and file1.html"

この提案はまた、実装が非 SAPI 環境で動作する可能性があることを認識しています。 したがって、UploadedFileInterface は、環境に関係なく操作が確実に動作するようにするためのメソッドを提供します。

  • moveTo($targetPath) は一時的なアップロードファイルで直接 move_uploaded_file() を呼び出すための安全で推奨される代替手段として提供されています。 実装は、環境に基づいて使用する正しい操作を検出します。
  • getStream() は StreamInterface インスタンスを返します。 非 SAPI 環境では、個々のアップロードファイルを直接ファイルにではなく php://temp ストリームに解析することを提案しています。 そのような場合、アップロードファイルは存在しません。 したがって、getStream() は環境に関係なく動作することが保証されています。

例として

// Move a file to an upload directory
$filename = sprintf(
    '%s.%s',
    create_uuid(),
    pathinfo($file0->getClientFilename(), PATHINFO_EXTENSION)
);
$file0->moveTo(DATA_DIR . '/' . $filename);

// Stream a file to Amazon S3.
// Assume $s3wrapper is a PHP stream that will write to S3, and that
// Psr7StreamWrapper is a class that will decorate a StreamInterface as a PHP
// StreamWrapper.
$stream = new Psr7StreamWrapper($file1->getStream());
stream_copy_to_stream($stream, $s3wrapper);

パッケージ

説明されているインタフェースとクラスは、psr/http-message パッケージの一部として提供されています。

インターフェイス

各インターフェイスの詳細を以下に記します。

MessageInterface

HTTP メッセージは、クライアントからサーバーへのリクエストとサーバーからクライアントへの応答から構成されます。 このインタフェースは、それぞれに共通のメソッドを定義します。

メッセージは不変であるとみなされます。 状態を変更する可能性のあるすべてのメソッドは、現在のメッセージの内部状態を保持し、変更された状態を含むインスタンスを返すように実装する必要があります。

Psr\Http\Message\MessageInterface
<?php
namespace Psr\Http\Message;

interface MessageInterface
{
    /**
     * HTTPプロトコルのバージョンを文字列として取得する
     *
     * @return string HTTP protocol version.
     */
    public function getProtocolVersion();

    /**
     * 指定されたHTTPプロトコルバージョンのインスタンスを返す
     *
     * @param string $version HTTP protocol version
     * @return static
     */
    public function withProtocolVersion($version);

    /**
     * 全てのメッセージヘッダー値を取得する
     *
     * @return string[][]
     */
    public function getHeaders();

    /**
     * 名前でヘッダーが存在するかどうかをチェックする
     *
     * @param string $name
     * @return bool
     */
    public function hasHeader($name);

    /**
     * 名前でメッセージヘッダーの値を取得する
     *
     * @param string $name
     * @return string[]
     */
    public function getHeader($name);

    /**
     * 単一のヘッダーの値のコンマ区切り文字列を取得する
     *
     * @param string $name
     * @return string
     */
    public function getHeaderLine($name);

    /**
     * 指定されたヘッダを置き換え指定された値を持つインスタンスを返す
     *
     * @param string $name
     * @param string|string[] $value
     * @return static
     * @throws \InvalidArgumentException for invalid header names or values.
     */
    public function withHeader($name, $value);

    /**
     * 指定されたヘッダーに指定された値が追加されたインスタンスを返す
     *
     * @param string $name
     * @param string|string[] $value
     * @return static
     * @throws \InvalidArgumentException for invalid header names.
     * @throws \InvalidArgumentException for invalid header values.
     */
    public function withAddedHeader($name, $value);

    /**
     * 指定されたヘッダのないインスタンスを返す
     *
     * @param string $name
     * @return static
     */
    public function withoutHeader($name);

    /**
     * メッセージの本文を取得する
     *
     * @return StreamInterface
     */
    public function getBody();

    /**
     * 指定されたメッセージ本文を持つインスタンスを返す
     *
     * @param StreamInterface $body Body.
     * @return static
     * @throws \InvalidArgumentException When the body is not valid.
     */
    public function withBody(StreamInterface $body);
}

getProtocolVersion()

public function getProtocolVersion();
  • HTTP プロトコルのバージョンを文字列として取得します。
  • 文字列には、HTTP バージョン番号(例:"1.1"、"1.0")のみが含まれていなければなりません。

withProtocolVersion()

public function withProtocolVersion($version);
  • 指定された HTTP プロトコルバージョンのインスタンスを返します。
  • バージョン文字列には、HTTP バージョン番号(例:"1.1"、"1.0")だけが含まれていなければなりません。
  • このメソッドは、メッセージの不変性を保持するように実装し、新しいプロトコルバージョンを持つインスタンスを返す必要があります。

getHeaders()

public function getHeaders();
  • すべてのメッセージヘッダー値を取得します。
  • キーは、ワイヤを介して送信されるときのヘッダー名を表し、各値はヘッダーに関連付けられた文字列の配列です。
// ヘッダーを文字列として表す
foreach ($message->getHeaders() as $name => $values) {
    echo $name . ': ' . implode(', ', $values);
}

// ヘッダーを繰り返し送信します
foreach ($message->getHeaders() as $name => $values) {
    foreach ($values as $value) {
        header(sprintf('%s: %s', $name, $value), false);
    }
}
  • ヘッダー名は大文字小文字を区別しませんが、getHeaders() はヘッダーが最初に指定された正確なケースを保持します。
  • 戻り値として、メッセージのヘッダーの連想配列を返します。各キーはヘッダー名でなければならず、各値はそのヘッダーの文字列の配列でなければなりません。

hasHeader()

public function hasHeader($name);
  • 指定された大文字と小文字を区別しない名前でヘッダーが存在するかどうかをチェックします。
  • 引数には、大文字と小文字を区別しないヘッダーフィールド名を取ります。
  • 戻り値は大文字小文字を区別しない文字列比較を使用して、任意のヘッダー名が指定されたヘッダー名と一致する場合は true を返します。 メッセージに一致するヘッダー名が見つからない場合は false を返します。

getHeader()

public function getHeader($name);
  • 指定された大文字と小文字を区別しない名前でメッセージヘッダーの値を取得します。
  • このメソッドは、指定された大文字と小文字を区別しないヘッダー名のすべてのヘッダー値の配列を返します。
  • ヘッダーがメッセージに表示されない場合、このメソッドは空の配列を返す必要があります。
  • 引数に大文字と小文字を区別しないヘッダーフィールド名を取ります。
  • 戻り値として指定されたヘッダーに指定された文字列値の配列を返します。ヘッダーがメッセージに表示されない場合、このメソッドは空の配列を返す必要があります。

getHeaderLine()

public function getHeaderLine($name);
  • 単一のヘッダーの値のコンマ区切り文字列を取得します。
  • このメソッドは、指定された大文字と小文字を区別しないヘッダー名のすべてのヘッダー値を、コンマで連結した文字列として返します。
  • 注:すべてのヘッダー値がコンマ連結を使用して適切に表現されるわけではありません。そのようなヘッダーの場合は、代わりに getHeader() を使用し、連結するときに独自の区切り文字を指定します。
  • ヘッダーがメッセージに表示されない場合、このメソッドは空の文字列を返す必要があります。
  • 引数として、大文字と小文字を区別しないヘッダーフィールド名を取ります。
  • 戻り値は指定されたヘッダーに指定された値の文字列です。コンマで連結します。 ヘッダーがメッセージに表示されない場合、このメソッドは空の文字列を返さなければなりません。

withHeader()

public function withHeader($name, $value);
  • 指定されたヘッダを置き換え、指定された値を持つインスタンスを返します。
  • ヘッダー名は大文字小文字を区別しませんが、ヘッダーの大文字小文字はこの関数によって保持され、getHeaders() から返されます。
  • このメソッドは、メッセージの不変性を保持するような方法で実装する必要があり、新規および/または更新されたヘッダーと値を持つインスタンスを返す必要があります。
  • 第一引数に大文字と小文字を区別しないヘッダーフィールド名、第二引数にヘッダー値をとります。

withAddedHeader()

public function withAddedHeader($name, $value);
  • 指定されたヘッダーに指定された値が追加されたインスタンスを返します。
  • 指定されたヘッダーの既存の値は維持され、新しい値が既存のリストに追加されます。以前にヘッダーが存在しなかった場合は追加されます。
  • このメソッドは、メッセージの不変性を保持するような方法で実装されなければならず、新しいヘッダーや値を持つインスタンスを返さなければなりません。
  • 第一引数に追加する大文字と小文字を区別しないヘッダーフィールド名、第二引数にヘッダー値をとります。

withoutHeader()

public function withoutHeader($name);
  • 指定されたヘッダのないインスタンスを返します。
  • ヘッダーの解決は、大文字と小文字を区別しないで行う必要があります。
  • このメソッドは、メッセージの不変性を保持するような方法で実装する必要があり、名前付きヘッダーを削除するインスタンスを返す必要があります。
  • 引数として、削除する大文字と小文字を区別しないヘッダーフィールド名をとります。

getBody()

public function getBody();
  • メッセージの本文を取得します。
  • 戻り値には本文をストリームとして返します。

withBody()

public function withBody(StreamInterface $body);
  • 指定されたメッセージ本文を持つインスタンスを返します。
  • 引数( $body) StreamInterface オブジェクトでなければなりません。
  • このメソッドは、メッセージの不変性を保持するような方法で実装する必要があり、新しいボディストリームを持つ新しいインスタンスを返す必要があります。

RequestInterface

クライアント側リクエスト(発信側)のインターフェイス。 HTTP 仕様によれば、このインタフェースには以下の各プロパティが含まれています。

  • Protocol version
  • HTTP method
  • URI
  • Headers
  • Message body

構築中、実装は Host ヘッダが提供されていなければ、提供された URI から Host ヘッダを設定する必要があります。

リクエストは不変であるとみなされます。状態を変更する可能性のあるすべてのメソッドは、現在のメッセージの内部状態を保持し、変更された状態を含むインスタンスを返すように実装する必要があります。

Psr\Http\Message\RequestInterface
<?php
namespace Psr\Http\Message;

interface RequestInterface extends MessageInterface
{
    /**
     * メッセージのリクエストターゲットを取得する
     *
     * @return string
     */
    public function getRequestTarget();

    /**
     * 特定の request-target を持つインスタンスを返す
     *
     * @param mixed $requestTarget
     * @return static
     */
    public function withRequestTarget($requestTarget);

    /**
     * リクエストの HTTP メソッドを取得する
     *
     * @return string
     */
    public function getMethod();

    /**
     * 指定された HTTP メソッドを使用してインスタンスを返す
     *
     * @param string $method Case-sensitive method.
     * @return static
     * @throws \InvalidArgumentException for invalid HTTP methods.
     */
    public function withMethod($method);

    /**
     * URI インスタンスを取得する
     *
     * @return UriInterface
     */
    public function getUri();

    /**
     * 指定された URI を持つインスタンスを返す
     *
     * @param UriInterface $uri New request URI to use.
     * @param bool $preserveHost Preserve the original state of the Host header.
     * @return static
     */
    public function withUri(UriInterface $uri, $preserveHost = false);
}

getRequestTarget()

public function getRequestTarget();
  • メッセージのリクエストターゲットを取得します。
  • リクエスト(クライアント)、リクエスト(サーバー)、またはインスタンス(withRequestTarget() を参照)に指定されたように、メッセージの request-target を取得します。
  • ほとんどの場合、具体的な実装(下記の withRequestTarget() を参照)に値が与えられていない限り、これは合成された URI の基本形式になります。
  • URI が利用できず、特にリクエスト対象が指定されていない場合、このメソッドは文字列 "/"を返さなければなりません。

withRequestTarget()

public function withRequestTarget($requestTarget);
  • 特定の request-target を持つインスタンスを返します。
  • リクエストが例えば、絶対形式、権限形式、またはアスタリスク形式を指定するために、非オリジナル形式の request-target を必要とする場合、このメソッドを使用して、指定された request-target をそのまま使用してインスタンスを作成することができます。
  • このメソッドは、メッセージの不変性を保持するような方法で実装し、変更されたリクエストターゲットを持つインスタンスを返す必要があります。

リクエストメッセージで許可される様々な request-target の型
https://tools.ietf.org/html/rfc7230#section-5.3

getMethod()

public function getMethod();
  • リクエストの HTTP メソッドを取得します。
  • 戻り値として、リクエストメソッドを返します。

withMethod()

public function withMethod($method);
  • 指定された HTTP メソッドを使用してインスタンスを返します。
  • HTTP メソッド名は通常すべて大文字ですが、HTTP メソッド名では大文字と小文字が区別されるため、実装は特定の文字列を変更しません。
  • このメソッドは、メッセージの不変性を保持するように実装する必要があり、変更されたリクエストメソッドを持つインスタンスを返す必要があります。

getUri()

public function getUri();
  • URI インスタンスを取得します。
  • このメソッドは、UriInterface インスタンスを返す必要があります。
  • 戻り値として、リクエストの URI を表す UriInterface インスタンスを返します。

RFC3986 - 絶対 URI

withUri()

public function withUri(UriInterface $uri, $preserveHost = false);
  • 指定された URI を持つインスタンスを返します。
  • このメソッドは、URI にホストコンポーネントが含まれている場合、返されたリクエストの Host ヘッダーをデフォルトで更新する必要があります。 URI にホストコンポーネントが含まれていない場合は、既存のホストヘッダーを返されたリクエストに引き継がなければなりません。
  • preserveHost が true に設定されている場合、このメソッドは次の方法で Host ヘッダーとやりとりします。
    • Host ヘッダーがないか空で、新しい URI にホストコンポーネントが含まれている場合、このメソッドは返されたリクエストの Host ヘッダーを更新する必要があります
    • Host ヘッダーがないか空で、新しい URI にホストコンポーネントが含まれていない場合、このメソッドは返されたリクエストの Host ヘッダーを更新してはなりません
    • Host ヘッダーが存在し、空でない場合、このメソッドは返されたリクエストの Host ヘッダーを更新してはなりません。
  • このメソッドは、メッセージの不変性を保持するような方法で実装する必要があり、新しい UriInterface インスタンスを持つインスタンスを返す必要があります。

RFC3986 - 絶対 URI
https://tools.ietf.org/html/rfc3986#section-4.3

ServerRequestInterface

サーバー側 HTTP リクエスト(受信側)のインターフェイス。

HTTP 仕様によれば、このインタフェースには以下の各プロパティが含まれています。

  • Protocol version
  • HTTP method
  • URI
  • Headers
  • Message body

さらに、CGI および/または PHP 環境からアプリケーションに到着したすべてのデータをカプセル化します。

  • $_SERVER で表される値
  • 提供されるクッキー(通常は $_COOKIE 経由)
  • クエリ文字列引数(一般に $_GET 経由、または parse_str() 経由で解析されたもの)
  • ファイルがあればそれをアップロードする( $_FILES で表される)
  • 逆シリアル化されたボディパラメータ(一般に $_POST から)

$_SERVER の値は、リクエスト時にアプリケーションの状態を表すため、不変として扱われなければなりません。そのような値の変更を可能にする方法は提供されていない。 他の値は、 $_SERVER またはリクエスト本体から復元でき、アプリケーション中に処理が必要な場合があります(たとえば、コンテンツタイプに基づいてボディパラメータをデシリアライズするなど)

さらに、このインタフェースは、追加のパラメータ(例えば、URI パスマッチング、クッキー値の解読、非フォームエンコードされたボディコンテンツのデシリアライズ、許可ヘッダとユーザとの照合など)を導出および照合するリクエストをイントロスペクションするユーティリティを認識する。これらのパラメータは、attributes プロパティに格納されます。

リクエストは不変であるとみなされます。状態を変更する可能性のあるすべてのメソッドは、現在のメッセージの内部状態を保持し、変更された状態を含むインスタンスを返すように実装する必要があります。

Psr\Http\Message\ServerRequestInterface
<?php
namespace Psr\Http\Message;

interface ServerRequestInterface extends RequestInterface
{
/**
* サーバパラメータを取得する
*
* @return array
*/
public function getServerParams();

    /**
     * クッキーを取得する
     *
     * @return array
     */
    public function getCookieParams();

    /**
     * 指定されたCookieを持つインスタンスを返す
     *
     * @param array $cookies
     * @return static
     */
    public function withCookieParams(array $cookies);

    /**
     * クエリ文字列引数を取得する
     *
     * @return array
     */
    public function getQueryParams();

    /**
     * 指定されたクエリ文字列引数を持つインスタンスを返す
     *
     * @param array $query Array
     * @return static
     */
    public function withQueryParams(array $query);

    /**
     * 正規化されたファイルアップロードデータを取得する。
     *
     * @return array
     */
    public function getUploadedFiles();

    /**
     * 指定したアップロードファイルで新しいインスタンスを作成する。
     *
     * @param array $uploadedFiles
     * @return static
     * @throws \InvalidArgumentException if an invalid structure is provided.
     */
    public function withUploadedFiles(array $uploadedFiles);

    /**
     * リクエスト本文に含まれるすべてのパラメータを取得する。
     *
     * @return null|array|object
     */
    public function getParsedBody();

    /**
     * 指定された本体パラメータを持つインスタンスを返す
     *
     * @param null|array|object $data
     * @return static
     * @throws \InvalidArgumentException if an unsupported argument type is
     *     provided.
     */
    public function withParsedBody($data);

    /**
     * リクエストから派生した属性を取得する
     *
     * @return mixed[] Attributes derived from the request.
     */
    public function getAttributes();

    /**
     * 派生した単一のリクエスト属性を取得する。
     *
     * @param string $name
     * @param mixed $default
     * @return mixed
     */
    public function getAttribute($name, $default = null);

    /**
     * 指定された派生リクエスト属性を持つインスタンスを返す
     *
     * @param string $name
     * @param mixed $value
     * @return static
     */
    public function withAttribute($name, $value);

    /**
     * 指定された派生リクエスト属性を削除するインスタンスを返す
     *
     * @param string $name
     * @return static
     */
    public function withoutAttribute($name);
}

getServerParams()

public function getServerParams();
  • サーバパラメータを取得します。
  • 通常 PHP の _SERVER から発信される必要はありません。

getCookieParams()

  • クライアントからサーバーに送信された Cookie を取得します。
  • データは $_COOKIE スーパーグローバルの構造と互換性がなければなりません。

withCookieParams()

public function withCookieParams(array $cookies);
  • 指定された Cookie を持つインスタンスを返します。
  • データは _COOKIE の構造と互換性がなければなりません。通常、このデータはインスタンス化時に注入されます。
  • このメソッドは、リクエストインスタンスの関連する Cookie ヘッダーや、サーバーパラメータの関連する値を更新してはいけません。
  • このメソッドは、メッセージの不変性を保持するような方法で実装し、更新された Cookie 値を持つインスタンスを返す必要があります。
  • 引数として、Cookie を表すキー/値のペアの配列をとります。

getQueryParams()

public function getQueryParams();
  • クエリ文字列引数を取得します。
  • 逆シリアル化されたクエリ文字列引数があれば取得します。
  • 注:照会パラメーターは URI またはサーバーパラメーターと同期していない可能性があります。元の値だけを確実に取得する必要がある場合は、getUri()->getQuery() または QUERY_STRING サーバのパラメータからクエリ文字列を解析する必要があります。

withQueryParams()

public function withQueryParams(array $query);
  • 指定されたクエリ文字列引数を持つインスタンスを返します。
  • これらの値は、受信リクエストの過程で不変でなければなりません。 PHP の $_GET スーパーグローバルからのインスタンス化の際に注入されるか、URI のような他の値から派生されるかもしれません。引数が URI から解析される場合、データは、重複するクエリパラメータがどのように処理されるか、ネストされたセットがどのように処理されるかを目的として返される PHP の parse_str() と互換性がなければなりません。
  • クエリ文字列引数を設定しても、リクエストによって格納された URI やサーバーのパラメータは変更されてはなりません。
  • このメソッドは、メッセージの不変性を保持するように実装する必要があり、更新されたクエリ文字列引数を持つインスタンスを返す必要があります。
  • 引数の _GET からのクエリ文字列引数の配列です。

getUploadedFiles()

public function getUploadedFiles();
  • 正規化されたファイルアップロードデータを取得します。
  • このメソッドは、各リーフが UploadedFileInterface のインスタンスを持つ正規化されたツリーにアップロードメタデータを返します。
  • これらの値は、インスタンス化時に $_FILES またはメッセージ本文から作成するか、withUploadedFiles() で注入することができます。
  • 戻り値は、UploadedFileInterface インスタンスの配列ツリー、もしデータが存在しない場合は空の配列を返す必要があります。

withUploadedFiles()

public function withUploadedFiles(array $uploadedFiles);
  • 指定したアップロードファイルで新しいインスタンスを作成します。
  • このメソッドは、メッセージの不変性を保持するような方法で実装し、更新されたボディパラメーターを持つインスタンスを返す必要があります。
  • 引数は UploadedFileInterface インスタンスの配列ツリーです。

getParsedBody()

public function getParsedBody();
  • リクエスト本文に含まれるすべてのパラメータを取得します。
  • リクエスト Content-Type が application/x-www-form-urlencoded または multipart/form-data のいずれかで、リクエストメソッドが POST の場合、このメソッドは $_POST の内容を返す必要があります。
  • それ以外の場合は、このメソッドはリクエスト本文の内容を逆シリアル化した結果を返します。 構文解析は構造化コンテンツを返すので、潜在的な型は配列またはオブジェクトのみでなければなりません。 null 値は、本文の内容がないことを示します。
  • 戻り値はデシリアライズされたボディパラメータ(存在する場合)。 これらは通常、配列またはオブジェクトになります。

withParsedBody()

public function withParsedBody($data);
  • 指定された本体パラメータを持つインスタンスを返します。
  • これらはインスタンス化の間に注入される可能性もあります。
  • リクエスト Content-Type が application/x-www-form-urlencoded または multipart/form-data のいずれかで、リクエストメソッドが POST の場合、このメソッドは $_POST の内容を挿入するためにのみ使用します。
  • データは $_POST から来る必要はありませんが、リクエスト本文の内容を逆シリアル化した結果でなければなりません。 逆直列化/解析は構造化データを返します。したがって、このメソッドは配列やオブジェクトのみを受け入れます。解析に利用できるものがない場合は null 値を受け取ります。
  • 例として、コンテンツネゴシエーションによってリクエストデータが JSON ペイロードであると判断された場合、このメソッドを使用して非直列化パラメータを含むリクエストインスタンスを作成できます。
  • このメソッドは、メッセージの不変性を保持するような方法で実装し、更新されたボディパラメーターを持つインスタンスを返す必要があります。
  • 引数として、デシリアライズされたボディデータをとります。 これは通常、配列またはオブジェクト内にあります。

getAttributes()

public function getAttributes();
  • リクエストから派生した属性を取得します。
  • リクエストの属性は、リクエストから導出された任意のパラメータ、例えば経路一致動作の結果を注入するのに使用することができます(クッキーを解読した結果、非形式符号化メッセージボディを非直列化した結果など)。属性はアプリケーションであり、リクエストは特定であり、変更可能です。

getAttribute()

public function getAttribute($name, $default = null);
  • 派生した単一のリクエスト属性を取得します。
  • getAttributes() で説明されているように、派生した単一のリクエスト属性を取得します。属性が以前に設定されていない場合は、指定された既定値を返します。
  • このメソッドは hasAttribute() メソッドの必要性を排除します。属性が見つからない場合に返されるデフォルト値を指定できるためです。
  • 第一引数には属性名、第二引数には属性が存在しない場合に返されるデフォルト値をとります。

withAttribute()

public function withAttribute($name, $value);
  • 指定された派生リクエスト属性を持つインスタンスを返します。
  • このメソッドでは、getAttributes() で説明されているように、派生した単一のリクエスト属性を設定できます。
  • このメソッドは、メッセージの不変性を保持するような方法で実装され、更新された属性を持つインスタンスを返す必要があります。
  • 第一引数に属性名、第二引数に属性値をとります。

withoutAttribute()

public function withoutAttribute($name);
  • 指定された派生リクエスト属性を削除するインスタンスを返します。
  • このメソッドを使用すると、getAttributes() で説明されているように、派生した単一のリクエスト属性を削除できます。
  • このメソッドは、メッセージの不変性を保持するような方法で実装し、属性を削除するインスタンスを返す必要があります。
  • 引数には属性名をとります。

ResponseInterface

サーバー側レスポンス(発信側)のインターフェイス。 HTTP 仕様によれば、このインタフェースには以下の各プロパティが含まれています。

  • Protocol version
  • Status code and reason phrase
  • Headers
  • Message body

レスポンスは不変であるとみなされます。 状態を変更する可能性のあるすべてのメソッドは、現在のメッセージの内部状態を保持し、変更された状態を含むインスタンスを返すように実装する必要があります。

Psr\Http\Message\ResponseInterface
<?php
namespace Psr\Http\Message;

interface ResponseInterface extends MessageInterface
{
    /**
     * レスポンスステータスコードを取得する。
     *
     * @return int Status code.
     */
    public function getStatusCode();

    /**
     * 指定されたステータスコードと、場合によっては理由フレーズを含むインスタンスを返す。
     *
     * @param int $code
     * @param string $reasonPhrase
     * @return static
     * @throws \InvalidArgumentException For invalid status code arguments.
     */
    public function withStatus($code, $reasonPhrase = '');

    /**
     * ステータスコードに関連付けられたレスポンス理由フレーズを取得する。
     *
     * @return string
     */
    public function getReasonPhrase();
}

getStatusCode()

public function getStatusCode();
  • レスポンスステータスコードを取得します。
  • ステータスコードはリクエストの結果コードで 3 桁の整数です。

withStatus()

public function withStatus($code, $reasonPhrase = '');
  • 指定されたステータスコードと、場合によっては理由フレーズを含むインスタンスを返します。
  • 理由フレーズが指定されていない場合、実装は応答のステータスコードのRFC7231 またはIANA 推奨理由フレーズ にデフォルトを設定することができます。
  • このメソッドは、メッセージの不変性を保持するような方法で実装する必要があり、更新されたステータスと理由フレーズを持つインスタンスを返す必要があります。
  • 第一引数には 3 桁の整数結果コードをセットします。第二引数には提供されたステータスコードで使用する理由フレーズ。 何も提供されない場合、実装は HTTP 仕様で提案されているようにデフォルトを使用するかもしれません。

getReasonPhrase()

public function getReasonPhrase();
  • ステータスコードに関連付けられたレスポンス理由フレーズを取得します。
  • 理由フレーズは応答ステータス行の必須要素ではないため、理由フレーズの値は空白になることがあります。実装は、レスポンスのステータスコードについて、デフォルトの RFC7231 推奨理由フレーズ(または IANA HTTP ステータスコードレジストリにリストされているもの)を返すことを選択することができます。
  • 戻り値として理由フレーズを返しますが、存在しない場合は空文字列を返す必要があります。

StreamInterface

データストリームを記述します。通常、インスタンスは PHP ストリームをラップします。このインタフェースは、ストリーム全体を文字列にシリアライズするなど、最も一般的な操作を包むラッパーを提供します。

Psr\Http\Message\StreamInterface
<?php
namespace Psr\Http\Message;

interface StreamInterface
{
    /**
     * ストリームのすべてのデータを最初から最後まで文字列に読み込む
     *
     * @return string
     */
    public function __toString();

    /**
     * ストリームと基本となるリソースをすべて閉じる
     *
     * @return void
     */
    public function close();

    /**
     * 基礎となるリソースをストリームから分離する
     *
     * @return resource|null Underlying PHP stream, if any
     */
    public function detach();

    /**
     * ストリームのサイズを取得する
     *
     * @return int|null
     */
    public function getSize();

    /**
     * ファイルの読み込み/書き込みポインタの現在の位置を返す
     *
     * @return int
     * @throws \RuntimeException on error.
     */
    public function tell();

    /**
     * ストリームがストリームの終わりにある場合は true を返す
     *
     * @return bool
     */
    public function eof();

    /**
     * ストリームがシーク可能かどうかを返す
     *
     * @return bool
     */
    public function isSeekable();

    /**
     * ストリーム内の位置を探す
     *
     * @param int $offset
     * @param int $whence
     * @throws \RuntimeException on failure.
     */
    public function seek($offset, $whence = SEEK_SET);

    /**
     * ストリームの先頭に移動する
     *
     * @throws \RuntimeException on failure.
     */
    public function rewind();

    /**
     * ストリームが書き込み可能かどうかを返す
     *
     * @return bool
     */
    public function isWritable();

    /**
     * データをストリームに書き込む
     *
     * @param string $string
     * @return int
     * @throws \RuntimeException on failure.
     */
    public function write($string);

    /**
     * ストリームが読み込み可能かどうかを返す
     *
     * @return bool
     */
    public function isReadable();

    /**
     * ストリームからデータを読み込む
     *
     * @param int $length
     * @return string
     * @throws \RuntimeException if an error occurs.
     */
    public function read($length);

    /**
     * 文字列の残りの内容を返す
     *
     * @return string
     * @throws \RuntimeException if unable to read.
     * @throws \RuntimeException if error occurs while reading.
     */
    public function getContents();

    /**
     * ストリームメタデータを連想配列として取得するか、特定のキーを取得する
     *
     * @param string $key
     * @return array|mixed|null
     */
    public function getMetadata($key = null);
}

__toString()

public function __toString();
  • ストリームのすべてのデータを最初から最後まで文字列に読み込みます。
  • このメソッドは、データを読み取る前にストリームの先頭にシークし、最後に達するまでストリームを読み取ろうとする必要があります。
  • 警告:これは、大量のデータをメモリにロードしようとする可能性があります。
  • このメソッドは、PHP の文字列キャスト操作に準拠するために例外を送出してはなりません。
  • [php.net]Magic Methods - tostring

close()

public function close();
  • ストリームと基本となるリソースをすべて閉じます。

detach()

public function detach();
  • 基礎となるリソースをストリームから分離します。
  • ストリームがデタッチされた後、ストリームは使用不可能な状態になります。

getSize()

public function getSize();
  • ストリームのサイズを取得します。
  • 戻り値は、既知の場合はバイト単位のサイズを返し、不明の場合は null を返します。

tell()

public function tell();
  • ファイルの読み込み/書き込みポインタの現在の位置を返します。
  • 戻り値として、ファイルポインタの位置を返します。

eof()

public function eof();
  • ストリームがストリームの終わりにある場合は true を返します。

isSeekable()

public function isSeekable();
  • ストリームがシーク可能かどうかを返します。

seek()

public function seek($offset, $whence = SEEK_SET);
  • ストリーム内の位置を探します。
  • 第一引数にストリームのオフセット、第二引数には
  • シークオフセットに基づいてカーソル位置を計算する方法を指定します。 有効な値は fseek() の組み込み PHP $whence 値と同じです。
    • SEEK_SET:オフセットバイトに等しい位置を設定します。
    • SEEK_CUR:現在の位置にオフセットを加えた位置に設定します。
    • SEEK_END:ストリームの終わりとオフセットに位置を設定します。

rewind()

public function rewind();
  • ストリームの先頭に移動します。
  • ストリームがシーク可能でない場合、このメソッドは例外を発生させます。 それ以外の場合は、seek(0) を実行します。
  • [php.net]seek()

isWritable()

public function isWritable();
  • ストリームが書き込み可能かどうかを返します。

write()

public function write($string);
  • データをストリームに書き込みます。
  • 引数には書き込む文字列をセットします。
  • 戻り値として、ストリームに書き込まれたバイト数を返します。

isReadable()

public function isReadable();
  • ストリームが読み込み可能かどうかを返します。

read()

public function read($length);
  • ストリームからデータを読み込みます。
  • 引数としてオブジェクトから最大 length よりも少ないバイトが返されます。
  • 戻り値として、ストリームから読み取られたデータを返します。使用可能なバイトがない場合は空の文字列を返します。

getContents()

public function getContents();
  • 文字列の残りの内容を返します。

getMetadata()

public function getMetadata($key = null);
  • ストリームメタデータを連想配列として取得するか、特定のキーを取得します。
  • 返されるキーは、PHP のstream_get_meta_data()関数から返されるキーと同じです。
  • 引数として、取得する特定のメタデータをとります。
  • 戻り値はキーが指定されていない場合は、連想配列を返します。 キーが提供され、その値が見つかった場合は特定のキー値を返し、キーが見つからない場合は null を返します。

UriInterface

URI を表す Value オブジェクトです。

このインタフェースは、RFC3986 に準拠した URI を表現し、最も一般的な操作のためのメソッドを提供するためのものです。 URI を操作するための追加機能は、インターフェイスの上部または外部に提供できます。主な用途は HTTP リクエストですが、他のコンテキストでも使用できます。

このインタフェースのインスタンスは不変であるとみなされます。状態を変更する可能性のあるすべてのメソッドは、現在のインスタンスの内部状態を保持し、変更された状態を含むインスタンスを返すように実装する必要があります。

通常、ホストヘッダーも要求メッセージに存在します。 サーバー側の要求の場合、通常、スキームはサーバー・パラメーターで検出可能です。

Psr\Http\Message\UriInterface
<?php
namespace Psr\Http\Message;

interface UriInterface
{
    /**
     * URI のスキームコンポーネントを取得する
     *
     * @return string The URI scheme.
     */
    public function getScheme();

    /**
     * URI の権限コンポーネントを取得する

     * @return string The URI authority, in "[user-info@]host[:port]" format.
     */
    public function getAuthority();

    /**
     * URI のユーザー情報コンポーネントを取得する
     *
     * @return string
     */
    public function getUserInfo();

    /**
     * URI のホストコンポーネントを取得する
     *
     * @return string
     */
    public function getHost();

    /**
     * URI のポートコンポーネントを取得する
     *
     * @return null|int The URI port.
     */
    public function getPort();

    /**
     * URI のパスコンポーネントを取得する
     *
     * @return string The URI path.
     */
    public function getPath();

    /**
     * URI のクエリ文字列を取得する
     *
     * @return string The URI query string.
     */
    public function getQuery();

    /**
     * URI のフラグメントコンポーネントを取得する
     *
     * @return string The URI fragment.
     */
    public function getFragment();

    /**
     * 指定されたスキームを持つインスタンスを返す
     *
     * @param string $scheme
     * @return static A new instance with the specified scheme.
     * @throws \InvalidArgumentException for invalid schemes.
     * @throws \InvalidArgumentException for unsupported schemes.
     */
    public function withScheme($scheme);

    /**
     * 指定されたユーザ情報を持つインスタンスを返す
     *
     * @param string $user The user name to use for authority.
     * @param null|string $password The password associated with $user.
     * @return static A new instance with the specified user information.
     */
    public function withUserInfo($user, $password = null);

    /**
     * 指定されたホストを持つインスタンスを返す
     *
     * @param string $host
     * @return static
     * @throws \InvalidArgumentException for invalid hostnames.
     */
    public function withHost($host);

    /**
     * 指定されたポートを持つインスタンスを返す
     *
     * @param null|int $port The port to use with the new instance; a null value
     *     removes the port information.
     * @return static A new instance with the specified port.
     * @throws \InvalidArgumentException for invalid ports.
     */
    public function withPort($port);

    /**
     * 指定されたパスを持つインスタンスを返す
     *
     * @param string $path The path to use with the new instance.
     * @return static A new instance with the specified path.
     * @throws \InvalidArgumentException for invalid paths.
     */
    public function withPath($path);

    /**
     * 指定したクエリ文字列を持つインスタンスを返す
     *
     * @param string $query
     * @return static
     * @throws \InvalidArgumentException for invalid query strings.
     */
    public function withQuery($query);

    /**
     * 指定された URI フラグメントを持つインスタンスを返す
     *
     * @param string $fragment The fragment to use with the new instance.
     * @return static A new instance with the specified fragment.
     */
    public function withFragment($fragment);

    /**
     * 文字列表現を URI 参照として返す
     *
     * @return string
     */
    public function __toString();
}

getScheme()

public function getScheme();
  • URI のスキームコンポーネントを取得します。
  • スキームが存在しない場合、このメソッドは空の文字列を返さなければなりません。
  • 返される値は、RFC3986 のセクション 3.1 で小文字に正規化されなければなりません。
  • 末尾の ":"文字はスキームの一部ではないため、追加しないでください。
  • 戻り値として、URI スキームを返します

getAuthority()

public function getAuthority();
  • URI の権限コンポーネントを取得します。
  • 権限情報が存在しない場合、このメソッドは空の文字列を返す必要があります。

URI の権限構文は次のとおりです。

[user-info@]host[:port]

ポートコンポーネントが設定されていないか、現在のスキームの標準ポートである場合は、ポートコンポーネントを含めないでください。

RFC3986 - Authority
https://tools.ietf.org/html/rfc3986#section-3.2

getUserInfo()

public function getUserInfo();
  • URI のユーザー情報コンポーネントを取得します。
  • ユーザー情報が存在しない場合、このメソッドは空の文字列を返す必要があります。
  • ユーザーが URI に存在する場合、これはその値を返します。 また、パスワードが存在する場合は、ユーザー値にコロン : を付加して値を分離します。
  • 末尾の @文字はユーザー情報の一部ではないため、追加しないでください。
  • 戻り値は username[:password] 形式の URI ユーザー情報です。

getHost()

public function getHost();
  • URI のホストコンポーネントを取得します。
  • ホストが存在しない場合、このメソッドは空の文字列を返さなければなりません。
  • 返される値は、RFC3986 3.2.2項 に従って、小文字に正規化されなければなりません。
  • 戻り値として、URI ホストを返します。

getPort()

public function getPort();
  • URI のポートコンポーネントを取得します。
  • ポートが存在し、現在のスキームでは標準ではない場合、このメソッドはそれを整数として返す必要があります。
  • ポートが現在のスキームで使用される標準ポートである場合、このメソッドは null を返す必要があります。
  • ポートが存在せず、スキームが存在しない場合、このメソッドは null 値を返す必要があります。
  • ポートは存在しませんが、スキームが存在する場合、このメソッドはそのスキームの標準ポートを返しますが、null を返す必要があります。

getPath()

public function getPath();
  • URI のパスコンポーネントを取得します。
  • パスは空または絶対パス(スラッシュで始まる)またはルートなし(スラッシュで始まらない)のいずれかです。実装は 3 つの構文すべてをサポートしなければなりません。
  • 通常、空のパスと絶対パスは、RFC 7230 のセクション 2.7.3 で定義されているように等しいと見なされます。しかし、このメソッドは自動的にこの正規化を行わないでください。
  • 返される値はパーセントエンコードである必要がありますが、任意の文字を二重にエンコードしてはいけません。エンコードする文字を決定するには、RFC3986セクション 2 および3.3 を参照してください。

getQuery()

public function getQuery();
  • URI のクエリ文字列を取得します。
  • クエリ文字列がない場合、このメソッドは空の文字列を返す必要があります。
  • 先頭の「?」文字はクエリの一部ではないため、追加する必要はありません。
  • 返される値はパーセントエンコードである必要がありますが、任意の文字を二重にエンコードしてはいけません。エンコードする文字を決定するには、RFC 3986 セクション 2 および3.4 を参照してください。
  • たとえば、クエリ文字列のキーと値のペアの値に、値の区切りとして意図されていないアンパサンド(&)が含まれる場合、その値はエンコードされた形式(例:% 26)で渡されなければなりません インスタンスに追加します。

getFragment()

public function getFragment();
  • URI のフラグメントコンポーネントを取得します。
  • フラグメントが存在しない場合、このメソッドは空の文字列を返す必要があります。
  • 先頭の「#」文字はフラグメントの一部ではないため、追加しないでください。
  • 返される値はパーセントエンコードである必要がありますが、任意の文字を二重にエンコードしてはいけません。エンコードする文字を決定するには、RFC3986 セクション 2 および3.5 を参照してください。

withScheme()

public function withScheme($scheme);
  • 指定されたスキームを持つインスタンスを返します。
  • このメソッドは、現在のインスタンスの状態を保持し、指定されたスキームを含むインスタンスを返す必要があります。
  • 実装は、http と https のスキームを無意識にサポートする必要があり、必要に応じて他のスキームに対応することができます。
  • 空のスキームはスキームを削除するのと同じです。
  • 引数として新しいインスタンスで使用するスキームをとります。
  • 戻り値として指定されたスキームを持つ新しいインスタンスを返します。

withUserInfo()

public function withUserInfo($user, $password = null);
  • 指定されたユーザ情報を持つインスタンスを返します。
  • このメソッドは、現在のインスタンスの状態を保持し、指定されたユーザー情報を含むインスタンスを返す必要があります。
  • パスワードはオプションですが、ユーザー情報にユーザーを含める必要があります。 ユーザーの空の文字列はユーザー情報を削除するのと同じです。

withHost()

public function withHost($host);
  • 指定されたホストを持つインスタンスを返します。
  • このメソッドは、現在のインスタンスの状態を保持し、指定されたホストを含むインスタンスを返す必要があります。
  • 空のホスト値は、ホストを削除するのと同じです。
  • 引数には新しいインスタンスで使用するホスト名をとります。
  • 戻り値として、指定されたホストを持つ新しいインスタンスを返します。

withPort()

public function withPort($port);
  • 指定されたポートを持つインスタンスを返します。
  • このメソッドは、現在のインスタンスの状態を保持し、指定されたポートを含むインスタンスを返す必要があります。
  • 実装では、確立された TCP および UDP ポート範囲外のポートに対して例外が発生する必要があります。
  • ポートに提供される null 値は、ポート情報を削除するのと同じです。

withPath()

public function withPath($path);
  • 指定されたパスを持つインスタンスを返します。
  • このメソッドは、現在のインスタンスの状態を保持し、指定されたパスを含むインスタンスを返す必要があります。
  • パスは空または絶対パス(スラッシュで始まる)またはルートなし(スラッシュで始まらない)のいずれかです。 実装は 3 つの構文すべてをサポートしなければなりません。
  • HTTP パスがパス相対ではなくホスト相対である場合、スラッシュで始まる必要があります。 スラッシュで始まらない HTTP パスは、アプリケーションまたはコンシューマーに認識されるいくつかの基本パスからの相対パスとみなされます。
  • ユーザーは、エンコードされたパス文字とデコードされたパス文字を提供でき 実装は、getPath() で概説した正しいエンコーディングを保証します。
  • 引数には新しいインスタンスで使用するパスをとります。
  • 戻り値として指定されたクエリ文字列を持つ新しいインスタンスが返されます。

withFragment()

public function withFragment($fragment);
  • 指定された URI フラグメントを持つインスタンスを返します。
  • このメソッドは、現在のインスタンスの状態を保持し、指定された URI フラグメントを含むインスタンスを返す必要があります。
  • ユーザーは、エンコードされたフラグメント文字とデコードされたフラグメント文字を提供でき 実装は、getFragment() で概説されている正しいエンコーディングを保証します。
  • 空のフラグメント値は、フラグメントを削除するのと同じです。

__toString()

public function __toString();
  • 文字列表現を URI 参照として返します。
  • URI のどのコンポーネントが存在するかに応じて、結果の文字列は完全な URI か、RFC3986 のセクション 4.1 に従った相対参照です。このメソッドは、適切なデリミタを使用して、URI のさまざまなコンポーネントを連結します。
    • スキームが存在する場合は、接尾辞 :を付ける必要があります。
    • 権限が存在する場合は、接頭辞として //を付ける必要があります。
    • パスはデリミタなしで連結できます。 しかし、PHP が__toString() で例外をスローすることを許可しないため、URI 参照を有効にするためにパスを調整する必要があるケースが 2 つあります。
      • パスがルートなしで権限がある場合は、パスの先頭にスラッシュを付ける必要があります。
      • パスが複数の スラッシュで始まり、権限がない場合は、開始スラッシュを 1 に減らす必要があります。
    • クエリが存在する場合は、接頭辞として ?を付ける必要があります。
    • フラグメントが存在する場合は、#を接頭辞として使用する必要があります。

UploadedFileInterface

HTTP リクエストによってアップロードされたファイルを表す Value オブジェクトです。

このインタフェースのインスタンスは不変であるとみなされます。状態を変更する可能性のあるすべてのメソッドは、現在のインスタンスの内部状態を保持し、変更された状態を含むインスタンスを返すように実装する必要があります。

Psr\Http\Message\UploadedFileInterface
<?php
namespace Psr\Http\Message;

interface UploadedFileInterface
{
    /**
     * アップロードされたファイルを表すストリームを取得する
     *
     * @return StreamInterface Stream representation of the uploaded file.
     * @throws \RuntimeException in cases when no stream is available.
     * @throws \RuntimeException in cases when no stream can be created.
     */
    public function getStream();

    /**
     * アップロードしたファイルを新しい場所に移動する
     *
     * @param string $targetPath Path to which to move the uploaded file.
     * @throws \InvalidArgumentException if the $targetPath specified is invalid.
     * @throws \RuntimeException on any error during the move operation.
     * @throws \RuntimeException on the second or subsequent call to the method.
     */
    public function moveTo($targetPath);

    /**
     * ファイルサイズを取得する
     *
     * @return int|null The file size in bytes or null if unknown.
     */
    public function getSize();

    /**
     * アップロードされたファイルに関連付けられたエラーを取得する
     *
     * @return int One of PHP's UPLOAD_ERR_XXX constants.
     */
    public function getError();

    /**
     * クライアントから送信されたファイル名を取得する
     *
     * @return string|null The filename sent by the client or null if none
     *     was provided.
     */
    public function getClientFilename();

    /**
     * クライアントから送信されたメディアタイプを取得する
     *
     * @return string|null The media type sent by the client or null if none
     *     was provided.
     */
    public function getClientMediaType();
}

getStream()

public function getStream();
  • アップロードされたファイルを表すストリームを取得します。
  • このメソッドは、アップロードされたファイルを表す StreamInterface インスタンスを返す必要があります。このメソッドの目的は、stream_copy_to_stream() などのファイルアップロードを操作するためにネイティブの PHP ストリーム機能を利用できるようにすることです(このような関数で動作するネイティブの PHP ストリームラッパーでデコレーションする必要があります)
  • moveTo() メソッドが以前に呼び出された場合、このメソッドは例外を発生させる必要があります。

moveTo()

public function moveTo($targetPath);
  • アップロードしたファイルを新しい場所に移動します。
  • move_uploaded_file() の代わりにこのメソッドを使用します。この方法は、SAPI 環境と非 SAPI 環境の両方で動作することが保証されています。実装は、どの環境にいるかを判断し、適切なメソッド(move_uploaded_file(), rename(), またはストリーム操作)を使用して操作を実行する必要があります。
  • $targetPath は、絶対パスまたは相対パスにすることができます。相対パスの場合、解像度は PHP の rename()関数で使用されるものと同じでなければなりません。
  • 完了時に元のファイルまたはストリームを削除する必要があります。
  • このメソッドが複数回呼び出された場合、後続の呼び出しで例外が発生する必要があります。
  • $_FILES が設定されている SAPI 環境で使用する場合、moveTo() を使用してファイルを書き込むときには、is_uploaded_file() およびmove_uploaded_file() を使用して、アクセス権とアップロード状況を正しく確認してください。
  • ストリームに移動する場合は、getStream() を使用してください。これは、SAPI 操作でストリームの宛先への書き込みが保証されないためです。

getSize()

public function getSize();
  • ファイルサイズを取得します。
  • 実装は、PHP が実際に送信されたサイズに基づいてこれを計算するので、 $_FILES配列のファイルの size キーに格納されている値を返す必要があります。

getError()

public function getError();
  • アップロードされたファイルに関連付けられたエラーを取得します。
  • 戻り値は PHP の UPLOAD_ERR_XXX 定数のいずれかでなければなりません。
  • ファイルが正常にアップロードされた場合、このメソッドは UPLOAD_ERR_OK を返す必要があります。
  • 実装は、ファイルの error キーに格納された値を $_FILES配列に戻す必要があります。

getError()

public function getError();
  • アップロードされたファイルに関連付けられたエラーを取得します。
  • 戻り値は PHP の UPLOAD_ERR_XXX 定数のいずれかでなければなりません。
  • ファイルが正常にアップロードされた場合、このメソッドは UPLOAD_ERR_OK を返す必要があります。
  • 実装は、ファイルの error キーに格納された値を $_FILES配列に戻す必要があります。
  • [php.net]Error Messages Explained

getClientFilename()

public function getClientFilename();
  • クライアントから送信されたファイル名を取得します。
  • このメソッドから返された値を信頼しないでください。 クライアントはあなたのアプリケーションを破損またはハッキングする意図で悪質なファイル名を送信する可能性があります。
  • 実装は、ファイルの name キーに格納された値を $_FILES配列に戻す必要があります。

getClientMediaType()

public function getClientMediaType();
  • クライアントから送信されたメディアタイプを取得します。
  • このメソッドから返された値を信頼しないでください。 クライアントは、アプリケーションを破損またはハッキングする意図で悪質なメディアタイプを送信する可能性があります。
  • 実装は、ファイルの type キーに格納された値を $_FILES配列に戻す必要があります。

Author

rito

  • Backend Engineer
  • Tokyo, Japan
  • PHP 5 技術者認定上級試験 認定者
  • 統計検定 3 級