Laravel 8.x HTTP Requests

イントロダクション

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

リクエストの操作

リクエストへのアクセス

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

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * 新しいユーザーを保存
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $name = $request->input('name');

        //
    }
}

前述のように、ルートクロージャで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\Request;

class UserController extends Controller
{
    /**
     * 指定ユーザーを更新
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  string  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }
}

リクエストパスとメソッド

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

リクエストパスの取得

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']);

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

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

$method = $request->method();

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

リクエストヘッダ

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

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

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

hasHeaderメソッドを使用して、リクエストに特定のヘッダが含まれているか判定できます。

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

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

$token = $request->bearerToken();

リクエストIPアドレス

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

$ipAddress = $request->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のみを提供するため、expectsJsonメソッドを使用して、受信リクエストがJSONリクエストを期待しているかを手早く判定できます。

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

PSR-7リクエスト

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

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

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

use Psr\Http\Message\ServerRequestInterface;

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

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

入力

入力の取得

全入力データの取得

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

$input = $request->all();

単一入力値の取得

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

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

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

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

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

$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配列内にネストされている値を取得することもできます。

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

論理入力値の取得

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

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

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

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

$name = $request->name;

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

入力データの一部の取得

入力データのサブセットを取得する必要がある場合は、onlyメソッドとexceptメソッドを使用できます。これらのメソッドは両方とも、単一の「配列」または引数の動的リストを受け入れます。

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

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

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

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

Note: onlyメソッドは、指定したすべてのキー/値ペアを返します。ただし、リクエスト中に存在しないキー/値ペアは返しません。

入力の存在の判定

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

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

配列が指定されると、hasメソッドは、指定されたすべての値が存在するかどうかを判別します。

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

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

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

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

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

値がリクエストに存在し、空でないことを確認する場合は、filledメソッドを使用します。

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

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

$request->whenFilled('name', function ($input) {
    //
});

特定のキーがリクエストに含まれていないかを判定するには、missingメソッドを使用できます。

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

直前の入力

Laravelは、今のリクエストから次のリクエストまで入力を保持できます。この機能は、バリデーションエラーを検出した後にフォームを再入力するときに特に便利です。ただし、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はアプリケーションのグローバルミドルウェアスタックにApp\Http\Middleware\TrimStringsApp\Http\Middleware\ConvertEmptyStringsToNullミドルウェアを含めています。これらのミドルウェアは、App\Http\Kernelクラスによってグローバルミドルウェアスタックにリストされています。これらのミドルウェアは、リクエストに応じてすべての受信文字列フィールドを自動的にトリミングし、空の文字列フィールドをnullに変換します。これにより、ルートとコントローラでのこれらの正規化について心配する必要がなくなります。

この動作を無効にしたい場合は、アプリケーションのミドルウェアスタックから2ミドルウェアを削除するため、App\Http\Kernelクラスの$middlewareプロパティから2つのミドルウェアを削除してください。

ファイル

アップロード済みファイルの取得

アップロードしたファイルは、fileメソッドまたは動的プロパティを使用してIlluminate\Http\Requestインスタンスから取得できます。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ドキュメントを確認してください。

アップロード済みファイルの保存

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

storeメソッドは、ファイルシステムの設定済みルートディレクトリを基準にしてファイルを保存するパスを引数に取ります。ファイル名として機能する一意のIDが自動的に生成されるため、このパスにはファイル名を含めることはできません。

storeメソッドは、ファイルの保存に使用するディスクの名前を第2引数にオプションとして取ります。このメソッドは、ディスクのルートを基準にしたファイルのパスを返します。

$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');

Tip!! Laravelのファイルストレージの詳細は、完全なファイルストレージドキュメントを確認してください。

信頼できるプロキシの設定

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

これを解決するには、Laravelアプリケーションに含まれているApp\Http\Middleware\TrustProxiesミドルウェアを使用します。これにより、アプリケーションが信頼するロードバランサーまたはプロキシを手早くカスタマイズできます。信頼できるプロキシは、このミドルウェアの$proxiesプロパティに配列としてリストする必要があります。信頼できるプロキシの設定に加え、信頼すべきプロキシ「$headers」も設定できます。

<?php

namespace App\Http\Middleware;

use Fideloper\Proxy\TrustProxies as Middleware;
use Illuminate\Http\Request;

class TrustProxies extends Middleware
{
    /**
     * このアプリケーションで信頼できるプロキシ
     *
     * @var string|array
     */
    protected $proxies = [
        '192.168.1.1',
        '192.168.1.2',
    ];

    /**
     * プロキシを検出するために使用すべきヘッダ
     *
     * @var int
     */
    protected $headers = Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO;
}

Tip!! AWS Elasticロードバランシングを使用している場合、$headersの値はRequest::HEADER_X_FORWARDED_AWS_ELBである必要があります。$headersプロパティで使用できる定数の詳細については、信頼の置けるプロキシに関するSymfonyのドキュメントを確認してください。

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

Amazon AWSまたは別の「クラウド」ロードバランサープロバイダを使用している場合、実際のバランサーのIPアドレスがわからない場合があります。この場合、*を使用してすべてのプロキシを信頼できます。

/**
 * このアプリケーションで信頼できるプロキシ
 *
 * @var string|array
 */
protected $proxies = '*';

信頼できるホストの設定

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

通常、NginxやApacheなどのウェブサーバは、与えられたホスト名にマッチするリクエストのみをアプリケーションへ送信するように設定する必要があります。しかし、ウェブサーバを直接カスタマイズできず、Laravelに特定のホスト名にしか応答しないように指示する必要がある場合は、アプリケーションのミドルウェアであるApp\Http\Middleware\TrustHostsを有効にすることで可能になります。

TrustHostsミドルウェアは、アプリケーションの$middlewareスタックに最初から含まれていますが、これを有効にするためにあんコメントする必要があります。このミドルウェアのhostsメソッドで、アプリケーションが応答すべきホスト名を指定できます。Hostに他の値を持つヘッダの受信リクエストは拒否されます。

/**
 * 信頼できるホストパターンの取得
 *
 * @return array
 */
public function hosts()
{
    return [
        'laravel.test',
        $this->allSubdomainsOfApplicationUrl(),
    ];
}

allSubdomainsOfApplicationUrlヘルパメソッドは、アプリケーションのapp.url設定値のすべてのサブドメインにマッチする正規表現を返します。このヘルパメソッドは、ワイルドカードのサブドメインを利用するアプリケーションを構築する際に、アプリケーションのすべてのサブドメインを許可する便利な手段を提供しています。

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる