メインコンテンツまでスキップ

HTTP リクエスト

はじめに

Laravel の Illuminate\Http\Request クラスは、アプリケーションで処理されている現在の HTTP リクエストと、リクエストと共に送信された入力、クッキー、ファイルに対話するためのオブジェクト指向の方法を提供します。

リクエストとのやり取り

リクエストへのアクセス

依存性注入を使用して現在の HTTP リクエストのインスタンスを取得するには、ルートクロージャやコントローラーメソッドで Illuminate\Http\Request クラスを型ヒントする必要があります。Laravel の サービスコンテナ によって、受信リクエストのインスタンスが自動的に注入されます。

    <?php

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;

class UserController extends Controller
{
/**
* Store a new user.
*/
public function store(Request $request): RedirectResponse
{
$name = $request->input('name');

// Store the user...

return redirect('/users');
}
}

前述のように、ルートクロージャで Illuminate\Http\Request クラスを型ヒントすることもできます。サービスコンテナは、クロージャが実行されるときに受信リクエストを自動的に注入します。

    use Illuminate\Http\Request;

Route::get('/', function (Request $request) {
// ...
});

依存性注入とルートパラメータ

コントローラーメソッドがルートパラメータからの入力も期待している場合は、他の依存関係の後にルートパラメータをリストアップする必要があります。たとえば、次のようにルートが定義されている場合:

    use App\Http\Controllers\UserController;

Route::put('/user/{id}', [UserController::class, 'update']);

次のようにコントローラーメソッドを定義することで、Illuminate\Http\Requestを型ヒントとして指定し、idルートパラメータにアクセスできます:

    <?php

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;

class UserController extends Controller
{
/**
* Update the specified user.
*/
public function update(Request $request, string $id): RedirectResponse
{
// Update the user...

return redirect('/users');
}
}

リクエストパス、ホスト、およびメソッド

Illuminate\Http\Requestインスタンスは、受信したHTTPリクエストを調べるためのさまざまなメソッドを提供し、Symfony\Component\HttpFoundation\Requestクラスを拡張しています。以下では、いくつかの重要なメソッドについて説明します。

リクエストパスの取得

pathメソッドは、リクエストのパス情報を返します。したがって、受信したリクエストが http://example.com/foo/bar を対象としている場合、pathメソッドは foo/bar を返します:

    $uri = $request->path();

リクエストパス / ルートの検査

isメソッドを使用すると、受信したリクエストパスが指定されたパターンに一致するかどうかを検証できます。このメソッドを利用する際には、*文字をワイルドカードとして使用することができます:

    if ($request->is('admin/*')) {
// ...
}

routeIsメソッドを使用すると、受信したリクエストが名前付きルートに一致したかどうかを判断できます:

    if ($request->routeIs('admin.*')) {
// ...
}

リクエストURLの取得

受信したリクエストの完全なURLを取得するには、urlメソッドまたはfullUrlメソッドを使用できます。urlメソッドはクエリ文字列を除いたURLを返し、fullUrlメソッドはクエリ文字列を含みます:

    $url = $request->url();

$urlWithQueryString = $request->fullUrl();

現在のURLにクエリ文字列データを追加したい場合は、fullUrlWithQueryメソッドを呼び出すことができます。このメソッドは、指定されたクエリ文字列変数の配列を現在のクエリ文字列とマージします:

    $request->fullUrlWithQuery(['type' => 'phone']);

指定されたクエリ文字列パラメータなしで現在のURLを取得したい場合は、fullUrlWithoutQueryメソッドを利用できます:

$request->fullUrlWithoutQuery(['type']);

リクエストホストの取得

hosthttpHostschemeAndHttpHost メソッドを使用して、受信リクエストの "host" を取得できます:

    $request->host();
$request->httpHost();
$request->schemeAndHttpHost();

リクエストメソッドの取得

method メソッドはリクエストのHTTP動詞を返します。isMethod メソッドを使用して、HTTP動詞が指定された文字列と一致するかを確認できます:

    $method = $request->method();

if ($request->isMethod('post')) {
// ...
}

リクエストヘッダ

Illuminate\Http\Request インスタンスから header メソッドを使用してリクエストヘッダを取得できます。リクエストにヘッダが存在しない場合、null が返されます。ただし、header メソッドは、リクエストにヘッダが存在しない場合に返されるオプションの第2引数を受け入れます:

    $value = $request->header('X-Header-Name');

$value = $request->header('X-Header-Name', 'default');

hasHeader メソッドを使用して、リクエストに指定されたヘッダが含まれているかどうかを判断できます:

    if ($request->hasHeader('X-Header-Name')) {
// ...
}

便宜上、Authorization ヘッダからベアラートークンを取得するために bearerToken メソッドを使用できます。このようなヘッダが存在しない場合、空の文字列が返されます:

    $token = $request->bearerToken();

リクエストIPアドレス

ip メソッドを使用して、アプリケーションにリクエストを行ったクライアントのIPアドレスを取得できます:

    $ipAddress = $request->ip();

プロキシによって転送されたすべてのクライアントIPアドレスを含むIPアドレスの配列を取得したい場合は、ips メソッドを使用できます。"元の" クライアントIPアドレスは配列の最後にあります:

    $ipAddresses = $request->ips();

一般的に、IPアドレスは信頼できない、ユーザーが制御可能な入力と見なされ、情報提供のみに使用する必要があります。

コンテンツネゴシエーション

Laravel は Accept ヘッダを介して受信リクエストの要求されたコンテンツタイプを検査するためのいくつかのメソッドを提供しています。まず、getAcceptableContentTypes メソッドはリクエストで受け入れられるすべてのコンテンツタイプを含む配列を返します:

    $contentTypes = $request->getAcceptableContentTypes();

acceptsメソッドはコンテンツタイプの配列を受け入れ、リクエストで受け入れられるコンテンツタイプがいずれかである場合はtrueを返します。それ以外の場合はfalseが返されます。

    if ($request->accepts(['text/html', 'application/json'])) {
// ...
}

リクエストによって最も好ましいコンテンツタイプを決定するためにprefersメソッドを使用できます。提供されたコンテンツタイプのいずれもリクエストで受け入れられない場合は、nullが返されます。

    $preferred = $request->prefers(['text/html', 'application/json']);

多くのアプリケーションがHTMLまたはJSONのみを提供するため、着信リクエストがJSONレスポンスを期待しているかどうかを迅速に判断するためにexpectsJsonメソッドを使用できます。

    if ($request->expectsJson()) {
// ...
}

PSR-7 リクエスト

PSR-7標準は、リクエストやレスポンスを含むHTTPメッセージのインターフェースを指定しています。Laravelリクエストの代わりにPSR-7リクエストのインスタンスを取得したい場合は、まずいくつかのライブラリをインストールする必要があります。Laravelは、一般的なLaravelリクエストとレスポンスをPSR-7互換の実装に変換するためにSymfony HTTP Message Bridgeコンポーネントを使用しています。

composer require symfony/psr-http-message-bridge
composer require nyholm/psr7

これらのライブラリをインストールしたら、PSR-7リクエストを取得するために、ルートクロージャやコントローラーメソッドでリクエストインターフェースを型ヒントすることができます。

    use Psr\Http\Message\ServerRequestInterface;

Route::get('/', function (ServerRequestInterface $request) {
// ...
});

注記

ルートまたはコントローラーからPSR-7レスポンスインスタンスを返すと、自動的にLaravelレスポンスインスタンスに変換され、フレームワークによって表示されます。

入力

入力の取得

すべての入力データの取得

allメソッドを使用して、着信リクエストのすべての入力データをarrayとして取得できます。このメソッドは、着信リクエストがHTMLフォームからであるかXHRリクエストであるかに関係なく使用できます。

    $input = $request->all();

collectメソッドを使用すると、着信リクエストのすべての入力データをコレクションとして取得できます。

    $input = $request->collect();

collectメソッドを使用すると、受信リクエストの入力のサブセットをコレクションとして取得することもできます:

    $request->collect('users')->each(function (string $user) {
// ...
});

入力値の取得

いくつかの簡単なメソッドを使用すると、Illuminate\Http\Requestインスタンスからユーザー入力全体にアクセスできます。リクエストに使用されたHTTP動詞を気にする必要はありません。HTTP動詞に関係なく、inputメソッドを使用してユーザー入力を取得できます:

    $name = $request->input('name');

inputメソッドの第2引数としてデフォルト値を渡すことができます。要求された入力値がリクエストに存在しない場合、この値が返されます:

    $name = $request->input('name', 'Sally');

配列入力を含むフォームを扱う場合は、"dot"表記を使用して配列にアクセスします:

    $name = $request->input('products.0.name');

$names = $request->input('products.*.name');

連想配列としてすべての入力値を取得するには、引数なしでinputメソッドを呼び出すことができます:

    $input = $request->input();

クエリ文字列からの入力の取得

inputメソッドはリクエストペイロード全体(クエリ文字列を含む)から値を取得しますが、queryメソッドはクエリ文字列からの値のみを取得します:

    $name = $request->query('name');

要求されたクエリ文字列の値が存在しない場合、このメソッドの第2引数が返されます:

    $name = $request->query('name', 'Helen');

連想配列としてすべてのクエリ文字列の値を取得するには、引数なしでqueryメソッドを呼び出すことができます:

    $query = $request->query();

JSON入力値の取得

アプリケーションにJSONリクエストを送信する場合、リクエストのContent-Typeヘッダーが適切にapplication/jsonに設定されている限り、inputメソッドを介してJSONデータにアクセスできます。JSON配列/オブジェクト内にネストされた値を取得するために"dot"構文を使用することさえできます:

    $name = $request->input('user.name');

文字列入力値の取得


代わりに、リクエストの入力データをプリミティブな `string` として取得する代わりに、リクエストデータを [`Illuminate\Support\Stringable`](/docs/helpers#fluent-strings) のインスタンスとして取得するために `string` メソッドを使用することができます:

```php
$name = $request->string('name')->trim();

ブール値の入力値の取得

チェックボックスなどの HTML 要素を扱う際、アプリケーションは実際には文字列である "truthy" 値を受け取ることがあります。たとえば、"true" や "on" などです。便宜上、これらの値をブール値として取得するために boolean メソッドを使用することができます。boolean メソッドは、1、"1"、true、"true"、"on"、"yes" の場合に true を返します。それ以外の値はすべて false を返します:

    $archived = $request->boolean('archived');

日付入力値の取得

日付/時刻を含む入力値は、date メソッドを使用して Carbon インスタンスとして取得することができます。リクエストに指定された名前の入力値が含まれていない場合、null が返されます:

    $birthday = $request->date('birthday');

date メソッドが受け入れる 2 番目と 3 番目の引数は、それぞれ日付の形式とタイムゾーンを指定するために使用できます:

    $elapsed = $request->date('elapsed', '!H:i', 'Europe/Madrid');

入力値が存在するが無効な形式の場合、InvalidArgumentException がスローされます。そのため、date メソッドを呼び出す前に入力を検証することをお勧めします。

動的プロパティを介した入力の取得

あなたはIlluminate\Http\Request インスタンスの動的プロパティを使用してユーザー入力にアクセスすることもできます。たとえば、アプリケーションのフォームの1つに name フィールドが含まれている場合、次のようにフィールドの値にアクセスできます:

    $name = $request->name;

動的プロパティを使用する場合、Laravel はまずリクエストペイロード内のパラメータの値を検索します。存在しない場合、Laravel は一致したルートのパラメータ内のフィールドを検索します。

入力データの一部を取得する

入力データの一部を取得する必要がある場合、only メソッドと except メソッドを使用できます。これらのメソッドは、単一の array または動的な引数リストを受け入れます:

    $input = $request->only(['username', 'password']);

$input = $request->only('username', 'password');

$input = $request->except(['credit_card']);

$input = $request->except('credit_card');

警告

only メソッドはリクエストで要求されたすべてのキー/値ペアを返しますが、リクエストに存在しないキー/値ペアは返しません。

入力の存在

値がリクエストに存在するかどうかを判断するには、has メソッドを使用できます。has メソッドは、値がリクエストに存在する場合に true を返します:

    if ($request->has('name')) {
// ...
}

配列が与えられた場合、has メソッドは指定されたすべての値が存在するかどうかを判断します:

    if ($request->has(['name', 'email'])) {
// ...
}

hasAny メソッドは、指定された値のいずれかが存在する場合に true を返します:

    if ($request->hasAny(['name', 'email'])) {
// ...
}

whenHas メソッドは、値がリクエストに存在する場合に指定されたクロージャを実行します:

    $request->whenHas('name', function (string $input) {
// ...
});

whenHas メソッドには、リクエストに指定された値が存在しない場合に実行される2番目のクロージャを渡すこともできます:

    $request->whenHas('name', function (string $input) {
// The "name" value is present...
}, function () {
// The "name" value is not present...
});

値がリクエストに存在し、空の文字列でないかどうかを判断したい場合は、filled メソッドを使用できます:

    if ($request->filled('name')) {
// ...
}

anyFilled メソッドは、指定された値のいずれかが空の文字列でない場合に true を返します:

    if ($request->anyFilled(['name', 'email'])) {
// ...
}

whenFilled メソッドは、値がリクエストに存在し、空の文字列でない場合に指定されたクロージャを実行します:

第2のクロージャをwhenFilledメソッドに渡すことができ、指定された値が「入力済み」でない場合に実行されます:

    $request->whenFilled('name', function (string $input) {
// The "name" value is filled...
}, function () {
// The "name" value is not filled...
});

指定されたキーがリクエストから欠落しているかどうかを判断するには、missingおよびwhenMissingメソッドを使用できます:

    if ($request->missing('name')) {
// ...
}

$request->whenMissing('name', function () {
// The "name" value is missing...
}, function () {
// The "name" value is present...
});

追加の入力のマージ

時々、リクエストの既存の入力データに手動で追加の入力をマージする必要がある場合があります。これを達成するために、mergeメソッドを使用できます。リクエスト上で指定された入力キーがすでに存在する場合、mergeメソッドに提供されたデータによって上書きされます:

    $request->merge(['votes' => 0]);

mergeIfMissingメソッドは、リクエスト内の対応するキーがリクエストの入力データ内にまだ存在しない場合に、入力をリクエストにマージするために使用できます:

    $request->mergeIfMissing(['votes' => 0]);

以前の入力

Laravelでは、1つのリクエストから次のリクエストまでの間、入力を保持することができます。この機能は、バリデーションエラーを検出した後にフォームを再表示する際に特に便利です。ただし、Laravelの組み込みのバリデーション機能を使用している場合、これらのセッション入力フラッシュメソッドを直接手動で使用する必要はない可能性があります。なぜなら、Laravelの組み込みのバリデーション機能の一部が自動的にこれらを呼び出すからです。

セッションに入力をフラッシュ

Illuminate\Http\Requestクラスのflashメソッドは、現在の入力をセッションにフラッシュして、ユーザーの次のリクエストでアプリケーションに利用できるようにします:

    $request->flash();

flashOnlyおよびflashExceptメソッドを使用して、リクエストデータのサブセットをセッションにフラッシュすることもできます。これらのメソッドは、パスワードなどの機密情報をセッションから除外するために便利です:

    $request->flashOnly(['username', 'email']);

$request->flashExcept('password');

入力をフラッシュしてからリダイレクト

通常、入力をセッションにフラッシュしてから前のページにリダイレクトしたい場合、withInputメソッドを使用してリダイレクトに入力フラッシングを簡単にチェーンすることができます:

    return redirect('form')->withInput();

return redirect()->route('user.create')->withInput();

return redirect('form')->withInput(
$request->except('password')
);

古い入力の取得

前のリクエストからフラッシュされた入力を取得するには、Illuminate\Http\Requestのインスタンスでoldメソッドを呼び出します。oldメソッドは、以前にフラッシュされた入力データをセッションから取得します:

    $username = $request->old('username');

Laravelはグローバルなoldヘルパーも提供しています。Bladeテンプレート内で古い入力を表示する場合は、フォームを再入力するためにoldヘルパーを使用する方が便利です。指定されたフィールドに古い入力が存在しない場合、nullが返されます:

    <input type="text" name="username" value="{{ old('username') }}">

クッキー

リクエストからクッキーを取得

Laravelフレームワークによって作成されたすべてのクッキーは暗号化され、認証コードで署名されているため、クライアントによって変更された場合は無効と見なされます。リクエストからクッキーの値を取得するには、Illuminate\Http\Requestインスタンスでcookieメソッドを使用します:

    $value = $request->cookie('name');

入力のトリミングと正規化

デフォルトでは、LaravelはアプリケーションのグローバルミドルウェアスタックにIlluminate\Foundation\Http\Middleware\TrimStringsおよびIlluminate\Foundation\Http\Middleware\ConvertEmptyStringsToNullミドルウェアを含めます。これらのミドルウェアは、リクエストのすべての文字列フィールドを自動的にトリミングし、空の文字列フィールドをnullに変換します。これにより、ルートやコントローラでこれらの正規化について心配する必要がありません。

入力の正規化の無効化

すべてのリクエストでこの動作を無効にしたい場合は、アプリケーションのミドルウェアスタックからこれらの2つのミドルウェアを削除することで、アプリケーションのbootstrap/app.phpファイルで$middleware->removeメソッドを呼び出すことができます:

    use Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull;
use Illuminate\Foundation\Http\Middleware\TrimStrings;

->withMiddleware(function (Middleware $middleware) {
$middleware->remove([
ConvertEmptyStringsToNull::class,
TrimStrings::class,
]);
})

アプリケーションへの一部のリクエストで文字列のトリミングと空の文字列の変換を無効にしたい場合は、アプリケーションのbootstrap/app.phpファイル内でtrimStringsおよびconvertEmptyStringsToNullミドルウェアメソッドを使用できます。両方のメソッドは、入力の正規化をスキップするかどうかを示すtrueまたはfalseを返すべきクロージャの配列を受け入れます:

    ->withMiddleware(function (Middleware $middleware) {
$middleware->convertEmptyStringsToNull(except: [
fn (Request $request) => $request->is('admin/*'),
]);

$middleware->trimStrings(except: [
fn (Request $request) => $request->is('admin/*'),
]);
})

ファイル

アップロードされたファイルの取得

Illuminate\Http\Request インスタンスから file メソッドまたは動的プロパティを使用してアップロードされたファイルを取得できます。file メソッドは Illuminate\Http\UploadedFile クラスのインスタンスを返します。このクラスは PHP の SplFileInfo クラスを拡張しており、ファイルとのやり取りに使用できるさまざまなメソッドを提供します:

    $file = $request->file('photo');

$file = $request->photo;

hasFile メソッドを使用してリクエストにファイルが存在するかどうかを判定できます:

    if ($request->hasFile('photo')) {
// ...
}

アップロードの成功を検証

ファイルが存在するかどうかを確認するだけでなく、isValid メソッドを使用してファイルのアップロードに問題がなかったかを検証できます:

    if ($request->file('photo')->isValid()) {
// ...
}

ファイルパスと拡張子

UploadedFile クラスには、ファイルの完全修飾パスと拡張子にアクセスするためのメソッドも含まれています。extension メソッドは、ファイルの内容に基づいて拡張子を推測しようとします。この拡張子は、クライアントが提供した拡張子と異なる場合があります:

    $path = $request->photo->path();

$extension = $request->photo->extension();

その他のファイルメソッド

UploadedFile インスタンスにはさまざまな他のメソッドがあります。これらのメソッドに関する詳細は、クラスの API ドキュメント を参照してください。

アップロードされたファイルの保存

アップロードされたファイルを保存するには、通常、構成済みの ファイルシステム の1つを使用します。UploadedFile クラスには、アップロードされたファイルをディスクの1つに移動する store メソッドがあります。ディスクは、ローカルファイルシステム上の場所またはAmazon S3などのクラウドストレージ上の場所である可能性があります。

store メソッドは、ファイルを保存するべきパスをファイルシステムの構成済みルートディレクトリに対して相対的に指定します。このパスにはファイル名を含めてはいけません。なぜなら、ファイル名として自動的に生成される一意のIDが使用されるからです。


`store`メソッドは、ファイルを保存するために使用されるディスクの名前を指定するためのオプションの第2引数も受け入れます。このメソッドは、ファイルのパスをディスクのルートに対する相対パスで返します:

```php
$path = $request->photo->store('images');

$path = $request->photo->store('images', 's3');

自動的にファイル名を生成したくない場合は、storeAsメソッドを使用することができます。このメソッドは、パス、ファイル名、およびディスク名を引数として受け入れます:

    $path = $request->photo->storeAs('images', 'filename.jpg');

$path = $request->photo->storeAs('images', 'filename.jpg', 's3');

注記

Laravelにおけるファイルストレージに関する詳細は、完全なfile storage documentationをご覧ください。

信頼されたプロキシの構成

TLS / SSL証明書を終端するロードバランサーの背後でアプリケーションを実行している場合、urlヘルパーを使用してもアプリケーションがHTTPSリンクを生成しないことがあるかもしれません。通常、これはアプリケーションがロードバランサーからポート80で転送されたトラフィックを受け取り、セキュアなリンクを生成する必要があることを知らないためです。

この問題を解決するために、Laravelアプリケーションに含まれているIlluminate\Http\Middleware\TrustProxiesミドルウェアを有効にすることができます。これにより、アプリケーションが信頼する必要があるロードバランサーやプロキシを迅速にカスタマイズすることができます。信頼されるプロキシは、アプリケーションのbootstrap/app.phpファイルでtrustProxiesミドルウェアメソッドを使用して指定する必要があります:

    ->withMiddleware(function (Middleware $middleware) {
$middleware->trustProxies(at: [
'192.168.1.1',
'192.168.1.2',
]);
})

信頼されるプロキシを構成するだけでなく、信頼するべきプロキシヘッダーも構成することができます:

    ->withMiddleware(function (Middleware $middleware) {
$middleware->trustProxies(headers: Request::HEADER_X_FORWARDED_FOR |
Request::HEADER_X_FORWARDED_HOST |
Request::HEADER_X_FORWARDED_PORT |
Request::HEADER_X_FORWARDED_PROTO |
Request::HEADER_X_FORWARDED_AWS_ELB
);
})

注記

AWS Elastic Load Balancingを使用している場合、headersの値はRequest::HEADER_X_FORWARDED_AWS_ELBである必要があります。ロードバランサーがRFC 7239の標準Forwardedヘッダーを使用している場合、headersの値はRequest::HEADER_FORWARDEDである必要があります。headersの値で使用できる定数に関する詳細は、Symfonyのtrusting proxiesのドキュメントを参照してください。

すべてのプロキシを信頼する

Amazon AWSや他の「クラウド」ロードバランサープロバイダーを使用している場合、実際のロードバランサーのIPアドレスを知らないかもしれません。この場合、* を使用してすべてのプロキシを信頼することができます:

    ->withMiddleware(function (Middleware $middleware) {
$middleware->trustProxies(at: '*');
})

信頼されたホストを構成する

デフォルトでは、Laravel は受信したすべてのリクエストに応答し、HTTPリクエストの Host ヘッダーの内容に関係なく応答します。さらに、Webリクエスト中にアプリケーションへの絶対URLを生成する際に Host ヘッダーの値が使用されます。

通常、NginxやApacheなどのWebサーバーを構成して、特定のホスト名に一致するリクエストのみをアプリケーションに送信するようにする必要があります。ただし、Webサーバーを直接カスタマイズする機能がなく、Laravelに特定のホスト名にのみ応答するよう指示する必要がある場合は、アプリケーションで Illuminate\Http\Middleware\TrustHosts ミドルウェアを有効にすることで行うことができます。

TrustHosts ミドルウェアを有効にするには、アプリケーションの bootstrap/app.php ファイルで trustHosts ミドルウェアメソッドを呼び出す必要があります。このメソッドの at 引数を使用して、アプリケーションが応答するホスト名を指定できます。他の Host ヘッダーを持つ受信リクエストは拒否されます:

    ->withMiddleware(function (Middleware $middleware) {
$middleware->trustHosts(at: ['laravel.test']);
})

デフォルトでは、アプリケーションのURLのサブドメインからのリクエストも自動的に信頼されます。この動作を無効にしたい場合は、subdomains 引数を使用できます:

    ->withMiddleware(function (Middleware $middleware) {
$middleware->trustHosts(at: ['laravel.test'], subdomains: false);
})