RitoLabo

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

  • 公開:
  • 更新:
  • カテゴリ: PHP PSR
  • タグ: PHP,PSR,PSR-7

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

アジェンダ
  1. HTTPメッセージ
  2. 仕様
    1. メッセージ
    2. HTTP Headers
      1. 大文字と小文字を区別しないヘッダーフィールド名
      2. 複数の値を持つヘッダ
      3. ホストヘッダー
      4. ストリーム
      5. リクエストのターゲットとURI
      6. サーバー側リクエスト
      7. ファイルアップロード
  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 HEADER1 REQUEST HOST HEADER2 URI HOST COMPONENT3 RESULT
- - - -
- foo.com - foo.com
- foo.com bar.com foo.com
foo.com - bar.com foo.com
foo.com bar.com baz.com foo.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
https://tools.ietf.org/html/rfc3986#section-4.3

withUri()

public function withUri(UriInterface $uri, $preserveHost = false);
  • 指定されたURIを持つインスタンスを返します。
  • このメソッドは、URIにホストコンポーネントが含まれている場合、返されたリクエストのHostヘッダーをデフォルトで更新する必要があります。URIにホストコンポーネントが含まれていない場合は、既存のホストヘッダーを返されたリクエストに引き継がなければなりません。
  • $preserveHosttrueに設定することで、Hostヘッダーの元の状態を保持するようにオプトインすることができます。$preserveHosttrueに設定されている場合、このメソッドは次の方法で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スーパーグローバルから派生した受信リクエスト環境に関連するデータを取得します。データは$_SERVERから発信される必要はありません。

getCookieParams()

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

withCookieParams()

public function withCookieParams(array $cookies);
  • 指定されたCookieを持つインスタンスを返します。
  • データは$_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やサーバーのパラメータは変更されてはなりません。
  • このメソッドは、メッセージの不変性を保持するように実装する必要があり、更新されたクエリ文字列引数を持つインスタンスを返す必要があります。
  • 引数の$queryは、通常は$ _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バイトを読み取り、それらを返します。 基礎となるストリームコールがより少ないバイトを返す場合は、$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の権限構文は次のとおりです。

<pre>
[user-info@]host[:port]
</pre>

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

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配列に戻す必要があります。