ルートグループとミドルウェア
はじめに
「Laravel生活」シリーズではCRUDアプリを完成させました。このシリーズでは、実務で必ず使う機能を体系的に深掘りしていきます。
第1回は ルートグループ? 複数のルートにミドルウェアやURLプレフィックスをまとめて適用する仕組み。`Route::group()`や`Route::middleware()`で記述する。 と ミドルウェア? リクエストとコントローラーの間に挟まる処理。ログイン確認やログ記録など、すべてのリクエストに共通して行いたい処理を書く場所。 です。ルートが増えてくると「このグループには全部ログイン必須にしたい」「URLに /admin を付けたい」という要件が出てきます。それを1か所にまとめて書く方法を解説します。
ルートグループの基本
Route::group() を使うと、複数のルートに共通の設定をまとめて適用できます。
// 📁 routes/web.php
Route::group(['prefix' => 'admin'], function () {
Route::get('/dashboard', [AdminController::class, 'dashboard']);
Route::get('/users', [AdminController::class, 'users']);
});
上のコードは /admin/dashboard と /admin/users という2つのルートを定義しています。prefix を指定することで、各ルートに /admin を繰り返し書く必要がなくなります。
middleware() メソッドで書く方法
Route::group() の代わりに、チェーンで書く書き方もよく使われます。
// 📁 routes/web.php
Route::middleware('auth')
->prefix('admin')
->group(function () {
Route::get('/dashboard', [AdminController::class, 'dashboard']);
Route::get('/users', [AdminController::class, 'users']);
});
middleware('auth') はログイン済みユーザーだけ通す ミドルウェア? リクエストとコントローラーの間に挟まる処理。ログイン確認やログ記録など、すべてのリクエストに共通して行いたい処理を書く場所。 です。auth は Laravel に最初から用意されています。
ミドルウェアとは
ミドルウェア? リクエストとコントローラーの間に挟まる処理。ログイン確認やログ記録など、すべてのリクエストに共通して行いたい処理を書く場所。 はリクエストとコントローラーの間に「チェックポイント」を設ける仕組みです。
ブラウザ → ミドルウェア(チェック) → コントローラー → レスポンス
よく使うミドルウェア:
| 名前 | 役割 |
|---|---|
auth | ログイン済みか確認。未ログインなら /login へリダイレクト |
guest | 未ログインユーザー専用(ログイン済みならトップへ) |
throttle:60,1 | 1分間に60回までのリクエスト制限 |
カスタムミドルウェアを作る
自分で ミドルウェア? リクエストとコントローラーの間に挟まる処理。ログイン確認やログ記録など、すべてのリクエストに共通して行いたい処理を書く場所。 を作ることもできます。たとえば「管理者だけ通す」ミドルウェアを作ってみましょう。
① ファイルを生成する
php artisan make:middleware AdminOnly
app/Http/Middleware/AdminOnly.php が生成されます。
② 処理を書く
<?php
// 📁 app/Http/Middleware/AdminOnly.php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class AdminOnly
{
public function handle(Request $request, Closure $next)
{
// ログインユーザーのroleがadminでなければ403エラー
if ($request->user()?->role !== 'admin') {
abort(403, '管理者のみアクセスできます');
}
// 問題なければ次の処理へ進む
return $next($request);
}
}
$next($request) を呼ぶことで、チェックを通過したリクエストが次の処理(コントローラーなど)へ進みます。
③ ルートに適用する
// 📁 routes/web.php
Route::middleware(['auth', AdminOnly::class])
->prefix('admin')
->group(function () {
Route::get('/dashboard', [AdminController::class, 'dashboard']);
});
middleware() には配列で複数のミドルウェアを指定できます。上の例では「ログイン済み、かつ管理者」の両方を満たすユーザーだけが通れます。
ルートの名前付きグループ
name() をグループに適用すると、グループ内の全ルートにプレフィックスを付けた名前が付きます。
// 📁 routes/web.php
Route::name('admin.')
->prefix('admin')
->middleware(['auth', AdminOnly::class])
->group(function () {
Route::get('/dashboard', [AdminController::class, 'dashboard'])->name('dashboard');
Route::get('/users', [AdminController::class, 'users'])->name('users');
});
これで route('admin.dashboard') と route('admin.users') というルート名が使えます。
まとめ
Route::middleware()->prefix()->group()のチェーンで共通設定をまとめられるauthミドルウェアでログイン確認が簡単に書けるphp artisan make:middlewareでカスタムミドルウェアを生成できるhandle()メソッドの中でチェックし、$next($request)で次へ進める
次回はリソースルートとルートモデルバインディングを学びます。