はじめに

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

リクエストとの対話

リクエストへのアクセス

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

  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\RedirectResponse;
  4. use Illuminate\Http\Request;
  5. class UserController extends Controller
  6. {
  7. /**
  8. * Store a new user.
  9. */
  10. public function store(Request $request): RedirectResponse
  11. {
  12. $name = $request->input('name');
  13. // Store the user...
  14. return redirect('/users');
  15. }
  16. }

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

  1. use Illuminate\Http\Request;
  2. Route::get('/', function (Request $request) {
  3. // ...
  4. });

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

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

  1. use App\Http\Controllers\UserController;
  2. Route::put('/user/{id}', [UserController::class, 'update']);
  1. ``````php
  2. <?php
  3. namespace App\Http\Controllers;
  4. use Illuminate\Http\RedirectResponse;
  5. use Illuminate\Http\Request;
  6. class UserController extends Controller
  7. {
  8. /**
  9. * Update the specified user.
  10. */
  11. public function update(Request $request, string $id): RedirectResponse
  12. {
  13. // Update the user...
  14. return redirect('/users');
  15. }
  16. }
  17. `

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

  1. <a name="retrieving-the-request-path"></a>
  2. #### リクエストパスの取得
  3. `````path`````メソッドは、リクエストのパス情報を返します。したがって、受信リクエストが`````http://example.com/foo/bar`````をターゲットにしている場合、`````path`````メソッドは`````foo/bar`````を返します:
  4. ``````php
  5. $uri = $request->path();
  6. `

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

  1. ``````php
  2. if ($request->is('admin/*')) {
  3. // ...
  4. }
  5. `

routeIsメソッドを使用して、受信リクエストがnamed routeと一致しているかどうかを判断できます:

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

リクエストURLの取得

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

  1. $url = $request->url();
  2. $urlWithQueryString = $request->fullUrl();

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

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

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

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

リクエストホストの取得

受信リクエストの「ホスト」をhosthttpHost、およびschemeAndHttpHostメソッドを介して取得できます:

  1. $request->host();
  2. $request->httpHost();
  3. $request->schemeAndHttpHost();

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

  1. ``````php
  2. $method = $request->method();
  3. if ($request->isMethod('post')) {
  4. // ...
  5. }
  6. `

リクエストヘッダー

  1. ``````php
  2. $value = $request->header('X-Header-Name');
  3. $value = $request->header('X-Header-Name', 'default');
  4. `
  1. ``````php
  2. if ($request->hasHeader('X-Header-Name')) {
  3. // ...
  4. }
  5. `

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

  1. $token = $request->bearerToken();

リクエストIPアドレス

  1. ``````php
  2. $ipAddress = $request->ip();
  3. `

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

  1. $ipAddresses = $request->ips();

一般的に、IPアドレスは信頼できないユーザー制御の入力と見なされ、情報目的のみに使用されるべきです。

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

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

  1. $contentTypes = $request->getAcceptableContentTypes();
  1. ``````php
  2. if ($request->accepts(['text/html', 'application/json'])) {
  3. // ...
  4. }
  5. `
  1. ``````php
  2. $preferred = $request->prefers(['text/html', 'application/json']);
  3. `

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

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

PSR-7リクエスト

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

  1. composer require symfony/psr-http-message-bridge
  2. composer require nyholm/psr7

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

  1. use Psr\Http\Message\ServerRequestInterface;
  2. Route::get('/', function (ServerRequestInterface $request) {
  3. // ...
  4. });

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

入力

入力の取得

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

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

  1. $input = $request->all();
  1. ``````php
  2. $input = $request->collect();
  3. `
  1. ``````php
  2. $request->collect('users')->each(function (string $user) {
  3. // ...
  4. });
  5. `

入力値の取得

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

  1. $name = $request->input('name');
  1. ``````php
  2. $name = $request->input('name', 'Sally');
  3. `

配列入力を含むフォームで作業する場合は、「ドット」表記を使用して配列にアクセスします:

  1. $name = $request->input('products.0.name');
  2. $names = $request->input('products.*.name');
  1. ``````php
  2. $input = $request->input();
  3. `

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

  1. ``````php
  2. $name = $request->query('name');
  3. `

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

  1. $name = $request->query('name', 'Helen');
  1. ``````php
  2. $query = $request->query();
  3. `

JSON入力値の取得

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

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

文字列可能な入力値の取得

リクエストの入力データをプリミティブなstringとして取得する代わりに、stringメソッドを使用してリクエストデータをIlluminate\Support\Stringableのインスタンスとして取得できます:

  1. $name = $request->string('name')->trim();

整数入力値の取得

  1. ``````php
  2. $perPage = $request->integer('per_page');
  3. `

ブール入力値の取得

チェックボックスのようなHTML要素を扱うとき、アプリケーションは実際には文字列である「真」とされる値を受け取ることがあります。たとえば、「true」や「on」。便利なことに、booleanメソッドを使用してこれらの値をブール値として取得できます。booleanメソッドは、1、「1」、true、「true」、「on」、および「yes」に対してtrueを返します。他のすべての値はfalseを返します:

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

日付入力値の取得

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

  1. $birthday = $request->date('birthday');
  1. ``````php
  2. $elapsed = $request->date('elapsed', '!H:i', 'Europe/Madrid');
  3. `

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

列挙型入力値の取得

PHP列挙型に対応する入力値もリクエストから取得できます。リクエストに指定された名前の入力値が存在しない場合、または列挙型に入力値と一致するバックアップ値がない場合、nullが返されます。enumメソッドは、入力値の名前と列挙型クラスを最初と第二の引数として受け入れます:

  1. use App\Enums\Status;
  2. $status = $request->enum('status', Status::class);

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

  1. ``````php
  2. $name = $request->name;
  3. `

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

入力データの一部を取得

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

  1. $input = $request->only(['username', 'password']);
  2. $input = $request->only('username', 'password');
  3. $input = $request->except(['credit_card']);
  4. $input = $request->except('credit_card');
  1. <a name="input-presence"></a>
  2. ### 入力の存在
  3. `````has`````メソッドを使用して、リクエストに値が存在するかどうかを判断できます。`````has`````メソッドは、リクエストに値が存在する場合`````true`````を返します:
  4. ``````php
  5. if ($request->has('name')) {
  6. // ...
  7. }
  8. `

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

  1. if ($request->has(['name', 'email'])) {
  2. // ...
  3. }
  1. ``````php
  2. if ($request->hasAny(['name', 'email'])) {
  3. // ...
  4. }
  5. `
  1. ``````php
  2. $request->whenHas('name', function (string $input) {
  3. // ...
  4. });
  5. `

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

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

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

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

リクエストから値が欠落しているか、空の文字列であるかどうかを判断したい場合は、isNotFilledメソッドを使用できます:

  1. if ($request->isNotFilled('name')) {
  2. // ...
  3. }

配列が与えられた場合、isNotFilledメソッドは指定されたすべての値が欠落しているか空であるかどうかを判断します:

  1. if ($request->isNotFilled(['name', 'email'])) {
  2. // ...
  3. }
  1. ``````php
  2. if ($request->anyFilled(['name', 'email'])) {
  3. // ...
  4. }
  5. `
  1. ``````php
  2. $request->whenFilled('name', function (string $input) {
  3. // ...
  4. });
  5. `

指定された値が「埋められていない」場合に実行される第2のクロージャをwhenFilledメソッドに渡すことができます:

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

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

  1. if ($request->missing('name')) {
  2. // ...
  3. }
  4. $request->whenMissing('name', function () {
  5. // The "name" value is missing...
  6. }, function () {
  7. // The "name" value is present...
  8. });

追加入力のマージ

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

  1. $request->merge(['votes' => 0]);
  1. ``````php
  2. $request->mergeIfMissing(['votes' => 0]);
  3. `

古い入力

Laravelは、次のリクエスト中に1つのリクエストからの入力を保持することを許可します。この機能は、検証エラーを検出した後にフォームを再ポピュレートするのに特に便利です。ただし、Laravelの含まれている検証機能を使用している場合、Laravelの組み込み検証機能のいくつかが自動的にこれらのセッション入力フラッシングメソッドを呼び出すため、これらを手動で直接使用する必要がない場合があります。

セッションへの入力のフラッシング

  1. ``````php
  2. $request->flash();
  3. `
  1. ``````php
  2. $request->flashOnly(['username', 'email']);
  3. $request->flashExcept('password');
  4. `

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

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

  1. return redirect('/form')->withInput();
  2. return redirect()->route('user.create')->withInput();
  3. return redirect('/form')->withInput(
  4. $request->except('password')
  5. );

古い入力の取得

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

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

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

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

クッキー

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

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

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

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

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

入力の正規化を無効にする

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

  1. use Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull;
  2. use Illuminate\Foundation\Http\Middleware\TrimStrings;
  3. ->withMiddleware(function (Middleware $middleware) {
  4. $middleware->remove([
  5. ConvertEmptyStringsToNull::class,
  6. TrimStrings::class,
  7. ]);
  8. })

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

  1. ->withMiddleware(function (Middleware $middleware) {
  2. $middleware->convertEmptyStringsToNull(except: [
  3. fn (Request $request) => $request->is('admin/*'),
  4. ]);
  5. $middleware->trimStrings(except: [
  6. fn (Request $request) => $request->is('admin/*'),
  7. ]);
  8. })

ファイル

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

  1. ``````php
  2. $file = $request->file('photo');
  3. $file = $request->photo;
  4. `

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

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

成功したアップロードの検証

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

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

ファイルパスと拡張子

  1. ``````php
  2. $path = $request->photo->path();
  3. $extension = $request->photo->extension();
  4. `

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

  1. <a name="storing-uploaded-files"></a>
  2. ### アップロードされたファイルの保存
  3. アップロードされたファイルを保存するには、通常、構成された[ファイルシステム](/read/laravel-11-x/4a09c198479c00a5.md)の1つを使用します。`````UploadedFile`````クラスには、アップロードされたファイルをローカルファイルシステム上の場所やAmazon S3のようなクラウドストレージ場所の1つに移動する`````store`````メソッドがあります。
  4. `````store`````メソッドは、ファイルを保存するパスをファイルシステムの構成されたルートディレクトリに対して相対的に受け入れます。このパスにはファイル名を含めるべきではありません。ファイル名として使用される一意のIDが自動的に生成されます。
  5. `````store`````メソッドは、ファイルを保存するために使用されるディスクの名前のオプションの第2引数も受け入れます。このメソッドは、ディスクのルートに対して相対的なファイルのパスを返します:
  6. ``````php
  7. $path = $request->photo->store('images');
  8. $path = $request->photo->store('images', 's3');
  9. `

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

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

Laravelでのファイルストレージに関する詳細は、完全なファイルストレージドキュメントを参照してください。

信頼できるプロキシの構成

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

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

  1. ->withMiddleware(function (Middleware $middleware) {
  2. $middleware->trustProxies(at: [
  3. '192.168.1.1',
  4. '10.0.0.0/8',
  5. ]);
  6. })

信頼できるプロキシを構成することに加えて、信頼すべきプロキシヘッダーも構成できます:

  1. ->withMiddleware(function (Middleware $middleware) {
  2. $middleware->trustProxies(headers: Request::HEADER_X_FORWARDED_FOR |
  3. Request::HEADER_X_FORWARDED_HOST |
  4. Request::HEADER_X_FORWARDED_PORT |
  5. Request::HEADER_X_FORWARDED_PROTO |
  6. Request::HEADER_X_FORWARDED_AWS_ELB
  7. );
  8. })

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

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

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

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

信頼できるホストの構成

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

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

  1. ``````php
  2. ->withMiddleware(function (Middleware $middleware) {
  3. $middleware->trustHosts(at: ['laravel.test']);
  4. })
  5. `

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

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

アプリケーションの構成ファイルやデータベースにアクセスして信頼できるホストを判断する必要がある場合は、at引数にクロージャを提供できます:

  1. ->withMiddleware(function (Middleware $middleware) {
  2. $middleware->trustHosts(at: fn () => config('app.trusted_hosts'));
  3. })