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']);
リクエストホストの取得
host
、httpHost
、schemeAndHttpHost
メソッドを使用して、受信リクエストの "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;