#01 Laravel基礎

ルートグループとミドルウェア

はじめに

「Laravel生活」シリーズではCRUDアプリを完成させました。このシリーズでは、実務で必ず使う機能を体系的に深掘りしていきます。

第1回は ルートグループ? 複数のルートにミドルウェアやURLプレフィックスをまとめて適用する仕組み。`Route::group()`や`Route::middleware()`で記述する。 ミドルウェア? リクエストとコントローラーの間に挟まる処理。ログイン確認やログ記録など、すべてのリクエストに共通して行いたい処理を書く場所。 です。ルートが増えてくると「このグループには全部ログイン必須にしたい」「URLに /admin を付けたい」という要件が出てきます。それを1か所にまとめて書く方法を解説します。


ミドルウェアパイプライン リクエスト Request 認証チェック middleware auth 流量制限 middleware throttle コントローラー Controller ログインページ redirect ('/login') 通過 通過 未ログイン 通過(次の処理へ進む) ブロック(処理が止まる)
図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,11分間に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) で次へ進める

次回はリソースルートとルートモデルバインディングを学びます。