サイトを更新しています。 数日間、レイアウトや翻訳に不具合が出ることがあります。ドキュメントは引き続きご利用いただけます。表示が崩れている場合は、後ほど再読み込みしてください。

ホーム Laravel 10.x ルーティング

ルーティング

10.x 2026年3月7日

#基本的なルーティング

最も基本的なLaravelのルートはURIとクロージャを受け取り、複雑なルーティング設定ファイルなしでシンプルかつ表現力豊かにルートと動作を定義できます。

use Illuminate\Support\Facades\Route;

Route::get('/greeting', function () {
    return 'Hello World';
});

#デフォルトのルートファイル

すべてのLaravelのルートはroutesディレクトリ内のルートファイルで定義されます。これらのファイルはアプリケーションのApp\Providers\RouteServiceProviderによって自動的に読み込まれます。routes/web.phpファイルはウェブインターフェイス用のルートを定義し、webミドルウェアグループが割り当てられています。これによりセッション状態やCSRF保護などの機能が提供されます。routes/api.phpのルートはステートレスで、apiミドルウェアグループが割り当てられています。

ほとんどのアプリケーションでは、routes/web.phpファイルにルートを定義することから始めます。routes/web.phpで定義されたルートは、ブラウザで定義されたルートのURLにアクセスすることで利用できます。例えば、以下のルートにはブラウザでhttp://example.com/userにアクセスすることで到達できます。

use App\Http\Controllers\UserController;

Route::get('/user', [UserController::class, 'index']);

routes/api.phpファイルで定義されたルートはRouteServiceProviderによってルートグループにネストされます。このグループ内では/apiのURIプレフィックスが自動的に適用されるため、ファイル内のすべてのルートに手動で適用する必要はありません。プレフィックスやその他のルートグループのオプションはRouteServiceProviderクラスを修正して変更できます。

#利用可能なルーターのメソッド

ルーターは任意のHTTP動詞に応答するルートを登録できます:

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

複数のHTTP動詞に応答するルートを登録したい場合は、matchメソッドを使えます。また、すべてのHTTP動詞に応答するルートはanyメソッドで登録できます:

Route::match(['get', 'post'], '/', function () {
    // ...
});

Route::any('/', function () {
    // ...
});
Примечание

同じURIを共有する複数のルートを定義する場合、getpostputpatchdeleteoptionsメソッドを使ったルートは、anymatchredirectメソッドを使ったルートよりも先に定義してください。これにより、受信リクエストが正しいルートにマッチします。

#依存性注入

ルートのコールバックのシグネチャに必要な依存性をタイプヒントできます。宣言された依存性はLaravelのサービスコンテナによって自動的に解決され、コールバックに注入されます。例えば、Illuminate\Http\Requestクラスをタイプヒントすることで、現在のHTTPリクエストが自動的にルートコールバックに注入されます:

use Illuminate\Http\Request;

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

#CSRF保護

webルートファイルで定義されたPOSTPUTPATCHDELETEルートに向けたHTMLフォームには必ずCSRFトークンフィールドを含めてください。含まれていない場合、リクエストは拒否されます。CSRF保護の詳細はCSRFドキュメントをご覧ください:

<form method="POST" action="/profile">
    @csrf
    ...
</form>

#リダイレクトルート

別のURIにリダイレクトするルートを定義する場合は、Route::redirectメソッドを使えます。このメソッドは単純なリダイレクトを行うためにフルルートやコントローラーを定義する必要がない便利なショートカットです:

Route::redirect('/here', '/there');

デフォルトではRoute::redirect302ステータスコードを返します。オプションの第三引数でステータスコードをカスタマイズできます:

Route::redirect('/here', '/there', 301);

または、Route::permanentRedirectメソッドを使って301ステータスコードを返すこともできます:

Route::permanentRedirect('/here', '/there');
Внимание

リダイレクトルートでルートパラメータを使う場合、Laravelで予約されているdestinationstatusというパラメータは使用できません。

#ビュールート

ルートが単にビューを返すだけの場合、Route::viewメソッドを使えます。redirectメソッドと同様に、フルルートやコントローラーを定義する必要がない簡単なショートカットです。viewメソッドは最初の引数にURI、2番目にビュー名を受け取ります。さらに、オプションの3番目の引数でビューに渡すデータの配列を指定できます:

Route::view('/welcome', 'welcome');

Route::view('/welcome', 'welcome', ['name' => 'Taylor']);
Внимание

ビュールートでルートパラメータを使う場合、Laravelで予約されているviewdatastatusheadersというパラメータは使用できません。

#ルート一覧

route:list Artisanコマンドでアプリケーションに定義されたすべてのルートの概要を簡単に確認できます:

php artisan route:list

デフォルトでは、各ルートに割り当てられたミドルウェアはroute:listの出力に表示されませんが、-vオプションを付けることでルートミドルウェアやミドルウェアグループ名を表示できます:

php artisan route:list -v

# ミドルウェアグループを展開...
php artisan route:list -vv

特定のURIで始まるルートだけを表示するようLaravelに指示することもできます:

php artisan route:list --path=api

さらに、route:listコマンド実行時に--except-vendorオプションを指定することで、サードパーティパッケージによって定義されたルートを非表示にできます:

php artisan route:list --except-vendor

同様に、route:list コマンドを実行する際に --only-vendor オプションを指定すると、サードパーティパッケージによって定義されたルートのみを表示するように Laravel に指示できます:

php artisan route:list --only-vendor

#ルートパラメータ

#必須パラメータ

URIの一部をキャプチャする必要がある場合があります。例えば、URLからユーザーIDを取得したい場合などです。ルートパラメータを定義することで実現できます:

Route::get('/user/{id}', function (string $id) {
    return 'User '.$id;
});

ルートに必要なだけ多くのパラメータを定義できます:

Route::get('/posts/{post}/comments/{comment}', function (string $postId, string $commentId) {
    // ...
});

ルートパラメータは常に{}で囲み、アルファベット文字で構成する必要があります。アンダースコア(_)もパラメータ名に使用可能です。ルートパラメータは順序に基づいてルートコールバックやコントローラーに注入され、引数名は関係ありません。

#パラメータと依存性注入

ルートにLaravelのサービスコンテナから自動注入したい依存性がある場合、依存性の後にルートパラメータをリストしてください:

use Illuminate\Http\Request;

Route::get('/user/{id}', function (Request $request, string $id) {
    return 'User '.$id;
});

#オプションパラメータ

URIに常に存在しないかもしれないルートパラメータを指定したい場合があります。パラメータ名の後に?を付けることで実現できます。対応する変数にはデフォルト値を設定してください:

Route::get('/user/{name?}', function (?string $name = null) {
    return $name;
});

Route::get('/user/{name?}', function (?string $name = 'John') {
    return $name;
});

#正規表現による制約

whereメソッドを使ってルートパラメータの形式を制約できます。whereはパラメータ名と正規表現を受け取り、パラメータの制約を定義します:

Route::get('/user/{name}', function (string $name) {
    // ...
})->where('name', '[A-Za-z]+');

Route::get('/user/{id}', function (string $id) {
    // ...
})->where('id', '[0-9]+');

Route::get('/user/{id}/{name}', function (string $id, string $name) {
    // ...
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

便利なことに、よく使われる正規表現パターンにはヘルパーメソッドがあり、ルートに素早くパターン制約を追加できます:

Route::get('/user/{id}/{name}', function (string $id, string $name) {
    // ...
})->whereNumber('id')->whereAlpha('name');

Route::get('/user/{name}', function (string $name) {
    // ...
})->whereAlphaNumeric('name');

Route::get('/user/{id}', function (string $id) {
    // ...
})->whereUuid('id');

Route::get('/user/{id}', function (string $id) {
    //
})->whereUlid('id');

Route::get('/category/{category}', function (string $category) {
    // ...
})->whereIn('category', ['movie', 'song', 'painting']);

リクエストがルートのパターン制約にマッチしない場合、404 HTTPレスポンスが返されます。

#グローバル制約

ルートパラメータに常に特定の正規表現制約を適用したい場合、patternメソッドを使えます。これらのパターンはApp\Providers\RouteServiceProviderクラスのbootメソッドで定義してください:

/**
 * ルートモデルバインディング、パターンフィルターなどを定義します。
 */
public function boot(): void
{
    Route::pattern('id', '[0-9]+');
}

パターンを定義すると、そのパラメータ名を使うすべてのルートに自動的に適用されます:

Route::get('/user/{id}', function (string $id) {
    // {id}が数値の場合のみ実行されます...
});

#エンコードされたスラッシュ

Laravelのルーティングコンポーネントは/以外のすべての文字をルートパラメータ値に含めることができます。/をプレースホルダーに含めたい場合は、where条件の正規表現で明示的に許可する必要があります:

Route::get('/search/{search}', function (string $search) {
    return $search;
})->where('search', '.*');
Внимание

エンコードされたスラッシュは最後のルートセグメント内でのみサポートされています。

#名前付きルート

名前付きルートは特定のルートのURLやリダイレクトを便利に生成できます。ルート定義にnameメソッドをチェーンして名前を指定します:

Route::get('/user/profile', function () {
    // ...
})->name('profile');

コントローラーアクションにもルート名を指定できます:

Route::get(
    '/user/profile',
    [UserProfileController::class, 'show']
)->name('profile');
Внимание

ルート名は常に一意である必要があります。

#名前付きルートへのURL生成

ルートに名前を割り当てると、Laravel の route および redirect ヘルパー関数を使って、その名前を使った URL やリダイレクトを生成できます。

// URL を生成...
$url = route('profile');

// リダイレクトを生成...
return redirect()->route('profile');

return to_route('profile');

名前付きルートがパラメータを定義している場合、route 関数の第2引数にパラメータを渡せます。渡したパラメータは自動的に正しい位置に挿入されて URL が生成されます。

Route::get('/user/{id}/profile', function (string $id) {
    // ...
})->name('profile');

$url = route('profile', ['id' => 1]);

配列に追加のパラメータを渡すと、それらのキーと値は自動的に生成された URL のクエリ文字列に追加されます。

Route::get('/user/{id}/profile', function (string $id) {
    // ...
})->name('profile');

$url = route('profile', ['id' => 1, 'photos' => 'yes']);

// /user/1/profile?photos=yes
Примечание

URL パラメータのリクエスト全体でのデフォルト値(例えば現在のロケール)を指定したい場合があります。その場合は、URL::defaults メソッドを使えます。

#現在のルートの確認

現在のリクエストが特定の名前付きルートにルーティングされているかを判定したい場合、Route インスタンスの named メソッドを使えます。例えば、ルートミドルウェア内で現在のルート名をチェックできます。

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * 受信したリクエストを処理します。
 *
 * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
 */
public function handle(Request $request, Closure $next): Response
{
    if ($request->route()->named('profile')) {
        // ...
    }

    return $next($request);
}

#ルートグループ

ルートグループを使うと、多数のルートに対してミドルウェアなどの属性を共有でき、個別に属性を定義する必要がなくなります。

ネストしたグループは親グループの属性を賢く「マージ」しようとします。ミドルウェアや where 条件はマージされ、名前やプレフィックスは連結されます。名前空間の区切りや URI プレフィックスのスラッシュは適切に自動追加されます。

#ミドルウェア

グループ内のすべてのルートに ミドルウェア を割り当てるには、グループ定義の前に middleware メソッドを使います。ミドルウェアは配列に記載した順に実行されます。

Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // first と second ミドルウェアを使用...
    });

    Route::get('/user/profile', function () {
        // first と second ミドルウェアを使用...
    });
});

#コントローラー

グループ内のルートがすべて同じ コントローラー を使う場合、controller メソッドで共通のコントローラーを指定できます。ルート定義時には呼び出すコントローラーメソッドだけを指定すればよいです。

use App\Http\Controllers\OrderController;

Route::controller(OrderController::class)->group(function () {
    Route::get('/orders/{id}', 'show');
    Route::post('/orders', 'store');
});

#サブドメインルーティング

ルートグループはサブドメインルーティングにも使えます。サブドメインもルート URI と同様にパラメータを割り当てられ、サブドメインの一部をルートやコントローラーで利用できます。グループ定義の前に domain メソッドでサブドメインを指定します。

Route::domain('{account}.example.com')->group(function () {
    Route::get('user/{id}', function (string $account, string $id) {
        // ...
    });
});
Внимание

サブドメインルートを確実に到達可能にするため、ルートドメインのルートを登録する前にサブドメインルートを登録してください。これにより、同じ URI パスのルートドメインルートがサブドメインルートを上書きするのを防げます。

#ルートプレフィックス

prefix メソッドを使うと、グループ内のすべてのルートに指定した URI をプレフィックスとして付けられます。例えば、グループ内のすべてのルート URI に admin を付けたい場合などです。

Route::prefix('admin')->group(function () {
    Route::get('/users', function () {
        // "/admin/users" の URL にマッチ
    });
});

#ルート名のプレフィックス

name メソッドを使うと、グループ内のすべてのルート名に指定した文字列をプレフィックスとして付けられます。例えば、すべてのルート名に admin を付けたい場合です。指定した文字列はそのままプレフィックスとして付くため、末尾に . を付けるのを忘れないでください。

Route::name('admin.')->group(function () {
    Route::get('/users', function () {
        // ルート名は "admin.users" に割り当てられる...
    })->name('users');
});

#ルートモデルバインディング

ルートやコントローラーアクションにモデルの ID を注入する際、通常はその ID に対応するモデルをデータベースから取得します。Laravel のルートモデルバインディングは、モデルインスタンスを自動的にルートに注入する便利な方法を提供します。例えば、ユーザーの ID ではなく、その ID に対応する User モデルのインスタンスを注入できます。

#暗黙的バインディング

Laravel は、ルートやコントローラーアクションで型宣言された変数名がルートセグメント名と一致する場合、自動的に Eloquent モデルを解決します。例えば:

use App\Models\User;

Route::get('/users/{user}', function (User $user) {
    return $user->email;
});

$user 変数が App\Models\User モデルとして型宣言され、変数名が {user} URI セグメントと一致するため、Laravel はリクエスト URI の値に対応する ID を持つモデルインスタンスを自動的に注入します。該当するモデルが見つからない場合は、自動的に 404 HTTP レスポンスが返されます。

もちろん、コントローラーメソッドでも暗黙的バインディングは可能です。再度、{user} URI セグメントが App\Models\User 型宣言された $user 変数と一致していることに注意してください。

use App\Http\Controllers\UserController;
use App\Models\User;

// ルート定義...
Route::get('/users/{user}', [UserController::class, 'show']);

// コントローラーメソッド定義...
public function show(User $user)
{
    return view('user.profile', ['user' => $user]);
}

#ソフトデリートされたモデル

通常、暗黙的モデルバインディングは ソフトデリートされたモデルを取得しません。ただし、ルート定義に withTrashed メソッドをチェーンすることで、これらのモデルも取得するように指示できます。

use App\Models\User;

Route::get('/users/{user}', function (User $user) {
    return $user->email;
})->withTrashed();

#キーのカスタマイズ

Eloquent モデルを id 以外のカラムで解決したい場合があります。その場合は、ルートパラメータ定義でカラムを指定できます。

use App\Models\Post;

Route::get('/posts/{post:slug}', function (Post $post) {
    return $post;
});

モデルバインディングで常に id 以外のカラムを使いたい場合は、Eloquent モデルの getRouteKeyName メソッドをオーバーライドしてください。

/**
 * モデルのルートキーを取得します。
 */
public function getRouteKeyName(): string
{
    return 'slug';
}

#カスタムキーとスコーピング

1つのルート定義で複数の Eloquent モデルを暗黙的にバインドする場合、2つ目のモデルを前のモデルの子としてスコープしたいことがあります。例えば、特定のユーザーのブログ投稿をスラッグで取得する次のルート定義を考えます。

use App\Models\Post;
use App\Models\User;

Route::get('/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
    return $post;
});

カスタムキーを使ったネストしたルートパラメータの暗黙的バインディングでは、Laravel は親モデルのリレーション名を推測してクエリをスコープします。この場合、User モデルが posts というリレーションを持つと想定し、それを使って Post モデルを取得します。

必要に応じて、カスタムキーがなくても「子」バインディングをスコープするよう Laravel に指示できます。その場合は、ルート定義時に scopeBindings メソッドを呼び出します。

use App\Models\Post;
use App\Models\User;

Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
    return $post;
})->scopeBindings();

または、ルート定義のグループ全体にスコープバインディングを適用できます。

Route::scopeBindings()->group(function () {
    Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
        return $post;
    });
});

同様に、withoutScopedBindings メソッドを呼び出してスコープバインディングを明示的に無効にすることもできます。

Route::get('/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
    return $post;
})->withoutScopedBindings();

#モデルが見つからない場合の動作カスタマイズ

通常、暗黙的バインドされたモデルが見つからない場合は 404 HTTP レスポンスが返されますが、ルート定義時に missing メソッドを呼び出すことでこの動作をカスタマイズできます。missing メソッドは、モデルが見つからなかった場合に呼び出されるクロージャを受け取ります。

use App\Http\Controllers\LocationsController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redirect;

Route::get('/locations/{location:slug}', [LocationsController::class, 'show'])
        ->name('locations.view')
        ->missing(function (Request $request) {
            return Redirect::route('locations.index');
        });

#暗黙的 Enum バインディング

PHP 8.1 で Enum がサポートされました。これに対応して、Laravel はルート定義で 文字列バックの Enum を型宣言でき、そのルートセグメントが有効な Enum 値の場合のみルートを呼び出します。そうでなければ自動的に 404 HTTP レスポンスが返されます。例えば、次の Enum があるとします。

<?php

namespace App\Enums;

enum Category: string
{
    case Fruits = 'fruits';
    case People = 'people';
}

{category} ルートセグメントが fruits または people の場合のみルートが呼び出されます。それ以外は Laravel が 404 HTTP レスポンスを返します。

use App\Enums\Category;
use Illuminate\Support\Facades\Route;

Route::get('/categories/{category}', function (Category $category) {
    return $category->value;
});

#明示的バインディング

Laravel の暗黙的な慣習ベースのモデル解決を使わずに、ルートパラメータとモデルの対応を明示的に定義できます。明示的バインディングを登録するには、ルーターの model メソッドを使ってパラメータに対応するクラスを指定します。RouteServiceProvider クラスの boot メソッドの冒頭で明示的バインディングを定義してください。

use App\Models\User;
use Illuminate\Support\Facades\Route;

/**
 * ルートモデルバインディングやパターンフィルターなどを定義します。
 */
public function boot(): void
{
    Route::model('user', User::class);

    // ...
}

次に、{user} パラメータを含むルートを定義します。

use App\Models\User;

Route::get('/users/{user}', function (User $user) {
    // ...
});

すべての {user} パラメータを App\Models\User モデルにバインドしたため、そのクラスのインスタンスがルートに注入されます。例えば、users/1 へのリクエストは ID が 1User インスタンスを注入します。

該当するモデルがデータベースに存在しない場合は、自動的に 404 HTTP レスポンスが返されます。

#解決ロジックのカスタマイズ

独自のモデルバインディング解決ロジックを定義したい場合は、Route::bind メソッドを使用できます。bind メソッドに渡すクロージャはURIセグメントの値を受け取り、ルートに注入されるべきクラスのインスタンスを返す必要があります。このカスタマイズは、アプリケーションの RouteServiceProviderboot メソッド内で行います。

use App\Models\User;
use Illuminate\Support\Facades\Route;

/**
 * ルートモデルバインディングやパターンフィルターなどを定義します。
 */
public function boot(): void
{
    Route::bind('user', function (string $value) {
        return User::where('name', $value)->firstOrFail();
    });

    // ...
}

または、Eloquentモデルの resolveRouteBinding メソッドをオーバーライドすることもできます。このメソッドはURIセグメントの値を受け取り、ルートに注入されるべきクラスのインスタンスを返します。

/**
 * バインドされた値に対応するモデルを取得します。
 *
 * @param  mixed  $value
 * @param  string|null  $field
 * @return \Illuminate\Database\Eloquent\Model|null
 */
public function resolveRouteBinding($value, $field = null)
{
    return $this->where('name', $value)->firstOrFail();
}

ルートが暗黙的バインディングのスコーピングを利用している場合、親モデルの子バインディングを解決するために resolveChildRouteBinding メソッドが使用されます。

/**
 * バインドされた値に対応する子モデルを取得します。
 *
 * @param  string  $childType
 * @param  mixed  $value
 * @param  string|null  $field
 * @return \Illuminate\Database\Eloquent\Model|null
 */
public function resolveChildRouteBinding($childType, $value, $field)
{
    return parent::resolveChildRouteBinding($childType, $value, $field);
}

#フォールバックルート

Route::fallback メソッドを使うと、他のルートにマッチしなかったリクエストに対して実行されるルートを定義できます。通常、未処理のリクエストはアプリケーションの例外ハンドラーによって自動的に「404」ページが表示されます。ただし、fallback ルートは通常 routes/web.php ファイル内で定義するため、web ミドルウェアグループのすべてのミドルウェアがこのルートに適用されます。必要に応じて追加のミドルウェアをこのルートに付けることも可能です。

Route::fallback(function () {
    // ...
});
Внимание

フォールバックルートは、必ずアプリケーションで登録される最後のルートにしてください。

#レート制限

#レートリミッターの定義

Laravelには強力でカスタマイズ可能なレート制限サービスがあり、特定のルートやルートグループのトラフィック量を制限できます。まずはアプリケーションの要件に合ったレートリミッター設定を定義しましょう。

通常、レートリミッターはアプリケーションの App\Providers\RouteServiceProvider クラスの boot メソッド内で定義します。実際、このクラスにはすでにアプリケーションの routes/api.php ファイルのルートに適用されるレートリミッター定義が含まれています。

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;

/**
 * ルートモデルバインディング、パターンフィルター、その他のルート設定を定義します。
 */
protected function boot(): void
{
    RateLimiter::for('api', function (Request $request) {
        return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
    });

    // ...
}

レートリミッターは RateLimiter ファサードの for メソッドを使って定義します。for メソッドはレートリミッター名と、該当リミッターが適用されるルートに対して適用する制限設定を返すクロージャを受け取ります。制限設定は Illuminate\Cache\RateLimiting\Limit クラスのインスタンスで、このクラスには制限を簡単に定義できる便利なビルダーメソッドが含まれています。レートリミッター名は任意の文字列で構いません。

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;

/**
 * ルートモデルバインディング、パターンフィルター、その他のルート設定を定義します。
 */
protected function boot(): void
{
    RateLimiter::for('global', function (Request $request) {
        return Limit::perMinute(1000);
    });

    // ...
}

リクエストが指定されたレート制限を超えた場合、Laravelは自動的に429 HTTPステータスコードのレスポンスを返します。独自のレスポンスを定義したい場合は、response メソッドを使えます。

RateLimiter::for('global', function (Request $request) {
    return Limit::perMinute(1000)->response(function (Request $request, array $headers) {
        return response('Custom response...', 429, $headers);
    });
});

レートリミッターのコールバックはHTTPリクエストインスタンスを受け取るため、リクエストや認証済みユーザーに応じて動的に制限を設定できます。

RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->vipCustomer()
                ? Limit::none()
                : Limit::perMinute(100);
});

#レート制限のセグメント化

場合によっては、任意の値でレート制限をセグメント化したいことがあります。例えば、ユーザーがIPアドレスごとに1分間に100回ルートにアクセスできるようにしたい場合です。これを実現するには、レート制限を構築する際に by メソッドを使います。

RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->vipCustomer()
                ? Limit::none()
                : Limit::perMinute(100)->by($request->ip());
});

別の例として、認証済みユーザーIDごとに1分間に100回、ゲストはIPアドレスごとに1分間に10回までルートへのアクセスを制限することもできます。

RateLimiter::for('uploads', function (Request $request) {
    return $request->user()
                ? Limit::perMinute(100)->by($request->user()->id)
                : Limit::perMinute(10)->by($request->ip());
});

#複数のレート制限

必要に応じて、レートリミッター設定に複数のレート制限を配列で返すことができます。配列内の順序に従って各制限がルートに対して評価されます。

RateLimiter::for('login', function (Request $request) {
    return [
        Limit::perMinute(500),
        Limit::perMinute(3)->by($request->input('email')),
    ];
});

#ルートへのレートリミッターの適用

レートリミッターは、throttle ミドルウェア を使用してルートまたはルートグループに適用できます。throttle ミドルウェアは、ルートに割り当てるレートリミッターの名前を受け取ります:

Route::middleware(['throttle:uploads'])->group(function () {
    Route::post('/audio', function () {
        // ...
    });

    Route::post('/video', function () {
        // ...
    });
});

#Redisを使ったスロットリング

通常、throttle ミドルウェアは Illuminate\Routing\Middleware\ThrottleRequests クラスにマッピングされています。このマッピングはアプリケーションのHTTPカーネル(App\Http\Kernel)で定義されています。ただし、アプリケーションのキャッシュドライバーにRedisを使っている場合は、このマッピングを Illuminate\Routing\Middleware\ThrottleRequestsWithRedis クラスに変更するとよいでしょう。このクラスはRedisを使ったレート制限管理により効率的です。

'throttle' => \Illuminate\Routing\Middleware\ThrottleRequestsWithRedis::class,

#フォームメソッドの偽装

HTMLフォームは PUTPATCHDELETE アクションをサポートしていません。そのため、HTMLフォームから呼び出される PUTPATCHDELETE ルートを定義する場合は、フォームに隠しフィールド _method を追加する必要があります。_method フィールドの値がHTTPリクエストメソッドとして使用されます。

<form action="/example" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>

便利な方法として、@method Bladeディレクティブを使って _method 入力フィールドを生成できます。

<form action="/example" method="POST">
    @method('PUT')
    @csrf
</form>

#現在のルートへのアクセス

Route ファサードの currentcurrentRouteNamecurrentRouteAction メソッドを使って、現在のリクエストを処理しているルートの情報にアクセスできます。

use Illuminate\Support\Facades\Route;

$route = Route::current(); // Illuminate\Routing\Route
$name = Route::currentRouteName(); // string
$action = Route::currentRouteAction(); // string

Router と Route クラスで利用可能なすべてのメソッドを確認するには、Routeファサードの基になるクラスRouteインスタンス のAPIドキュメントを参照してください。

#クロスオリジンリソースシェアリング(CORS)

LaravelはCORSの OPTIONS HTTPリクエストに対して、設定した値で自動的に応答できます。すべてのCORS設定はアプリケーションの config/cors.php 設定ファイルで行います。OPTIONS リクエストは、グローバルミドルウェアスタックにデフォルトで含まれる HandleCors ミドルウェアによって自動的に処理されます。グローバルミドルウェアスタックはアプリケーションのHTTPカーネル(App\Http\Kernel)にあります。

Примечание

CORSおよびCORSヘッダーの詳細については、MDNのCORSに関するウェブドキュメントを参照してください。

#ルートキャッシュ

アプリケーションを本番環境にデプロイする際は、Laravelのルートキャッシュを活用してください。ルートキャッシュを使うと、アプリケーションのすべてのルート登録にかかる時間を大幅に短縮できます。ルートキャッシュを生成するには、route:cache Artisanコマンドを実行します。

php artisan route:cache

このコマンドを実行すると、キャッシュされたルートファイルがすべてのリクエストで読み込まれます。新しいルートを追加した場合は、再度ルートキャッシュを生成する必要があります。そのため、route:cache コマンドはプロジェクトのデプロイ時のみ実行してください。

ルートキャッシュをクリアするには、route:clear コマンドを使います。

php artisan route:clear