- 基本的なルーティング
- ルートパラメータ
- 名前付きルート
- ルートグループ
- ルートモデルバインディング
- フォールバックルート
- レート制限
- フォームメソッドの偽装
- 現在のルートへのアクセス
- クロスオリジンリソース共有 (CORS)
- ルートキャッシュ
#基本的なルーティング
最も基本的な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を共有する複数のルートを定義する場合、get、post、put、patch、delete、optionsメソッドを使ったルートは、any、match、redirectメソッドを使ったルートよりも先に定義してください。これにより、受信リクエストが正しいルートにマッチします。
#依存性注入
ルートのコールバックのシグネチャに必要な依存性をタイプヒントできます。宣言された依存性はLaravelのサービスコンテナによって自動的に解決され、コールバックに注入されます。例えば、Illuminate\Http\Requestクラスをタイプヒントすることで、現在のHTTPリクエストが自動的にルートコールバックに注入されます:
use Illuminate\Http\Request;
Route::get('/users', function (Request $request) {
// ...
});
#CSRF保護
webルートファイルで定義されたPOST、PUT、PATCH、DELETEルートに向けたHTMLフォームには必ずCSRFトークンフィールドを含めてください。含まれていない場合、リクエストは拒否されます。CSRF保護の詳細はCSRFドキュメントをご覧ください:
<form method="POST" action="/profile">
@csrf
...
</form>
#リダイレクトルート
別のURIにリダイレクトするルートを定義する場合は、Route::redirectメソッドを使えます。このメソッドは単純なリダイレクトを行うためにフルルートやコントローラーを定義する必要がない便利なショートカットです:
Route::redirect('/here', '/there');
デフォルトではRoute::redirectは302ステータスコードを返します。オプションの第三引数でステータスコードをカスタマイズできます:
Route::redirect('/here', '/there', 301);
または、Route::permanentRedirectメソッドを使って301ステータスコードを返すこともできます:
Route::permanentRedirect('/here', '/there');
リダイレクトルートでルートパラメータを使う場合、Laravelで予約されているdestinationとstatusというパラメータは使用できません。
#ビュールート
ルートが単にビューを返すだけの場合、Route::viewメソッドを使えます。redirectメソッドと同様に、フルルートやコントローラーを定義する必要がない簡単なショートカットです。viewメソッドは最初の引数にURI、2番目にビュー名を受け取ります。さらに、オプションの3番目の引数でビューに渡すデータの配列を指定できます:
Route::view('/welcome', 'welcome');
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);
ビュールートでルートパラメータを使う場合、Laravelで予約されているview、data、status、headersというパラメータは使用できません。
#ルート一覧
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 が 1 の User インスタンスを注入します。
該当するモデルがデータベースに存在しない場合は、自動的に 404 HTTP レスポンスが返されます。
#解決ロジックのカスタマイズ
独自のモデルバインディング解決ロジックを定義したい場合は、Route::bind メソッドを使用できます。bind メソッドに渡すクロージャはURIセグメントの値を受け取り、ルートに注入されるべきクラスのインスタンスを返す必要があります。このカスタマイズは、アプリケーションの RouteServiceProvider の boot メソッド内で行います。
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フォームは PUT、PATCH、DELETE アクションをサポートしていません。そのため、HTMLフォームから呼び出される PUT、PATCH、DELETE ルートを定義する場合は、フォームに隠しフィールド _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 ファサードの current、currentRouteName、currentRouteAction メソッドを使って、現在のリクエストを処理しているルートの情報にアクセスできます。
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