【Laravel】ルーティングをスッキリ整理!Route::groupの基本的な使い方と実践パターン

Laravel

LaravelでWebアプリケーションを開発していると、気づけば routes/web.phproutes/api.php の記述が膨れ上がってしまうことがあります。

  • 「管理画面のURLにはすべて /admin をつけたい」
  • 「特定のグループのルーティングには認証(auth)ミドルウェアを一括で適用したい」
  • 「コントローラー名を何度も書くのが面倒」

こういった悩みを一発で解決するのが、Laravelのルーティンググループ(Routing Group)機能です。

本記事では、Laravelのルーティンググループの基本概念から、よく使うPrefix・Middleware・Controllerなどのオプション指定方法、Laravel 9/10/11以降で主流の最新の書き方まで分かりやすく解説します。

1. ルーティンググループ(Route::group)とは?

ルーティンググループとは、複数のルートに対して共通の属性(ミドルウェア、URLプレフィックス、名前付きルートのプレフィックス、コントローラーなど)を一括で適用するための仕組みです。

グループ化を行うことで、コードの重複(DRY原則)を防ぎ、ルート定義の視認性と保守性を劇的に向上させることができます。

2. よく使うグループ化オプションと書き方

Laravelでは、Route::middleware()Route::prefix() などのメソッドをチェインして最後に group() を呼び出す構文が一般的です。

よく使う共通属性のパターンを見ていきましょう。

① ミドルウェアの一括適用(middleware)

特定のルート群に対して、ログインチェックやアクセス制限などのミドルウェアを一括で設定します。

PHP
use App\Http\Controllers\DashboardController;
use App\Http\Controllers\ProfileController;

// auth(認証済み)ミドルウェアをグループ全体に適用
Route::middleware(['auth'])->group(function () {
    Route::get('/dashboard', [DashboardController::class, 'index']);
    Route::get('/profile', [ProfileController::class, 'edit']);
});

② URLプレフィックスの付与(prefix)

グループ内の全ルートのURLの先頭に、共通のパスを追加します。

PHP
use App\Http\Controllers\Admin\UserController;
use App\Http\Controllers\Admin\SettingController;

// URLがすべて /admin/... になる
// 例: /admin/users, /admin/settings
Route::prefix('admin')->group(function () {
    Route::get('/users', [UserController::class, 'index']);
    Route::get('/settings', [SettingController::class, 'index']);
});

③ ルート名プレフィックスの付与(name)

route('admin.users') のように、ルート名(Name)の先頭に共通のドット繋ぎの文字列を付与します。

PHP
Route::name('admin.')->group(function () {
    // ルート名は "admin.users" になる
    Route::get('/users', [UserController::class, 'index'])->name('users');
    
    // ルート名は "admin.settings" になる
    Route::get('/settings', [SettingController::class, 'index'])->name('settings');
});

④ コントローラーの一括指定(controller)

グループ内のルートで共通のコントローラーを使用する場合、クラス名を一箇所にまとめることができます。(※Laravel 9以降で登場した非常に便利な書き方です)

PHP
use App\Http\Controllers\OrderController;

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

3. 実践!組み合わせた本格的なグループ化

実際の開発(例えば管理者ページ)では、上記で紹介した設定を複数組み合わせるケースがほとんどです。

管理画面用のルート定義(例)

PHP
use App\Http\Controllers\Admin\DashboardController;
use App\Http\Controllers\Admin\UserController;

Route::middleware(['auth', 'can:admin']) // 認証 & 管理者権限
    ->prefix('admin')                     // URL: /admin/...
    ->name('admin.')                      // Route Name: admin....
    ->group(function () {

        Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
        
        // ユーザー管理
        Route::controller(UserController::class)->prefix('users')->name('users.')->group(function () {
            Route::get('/', 'index')->name('index');       // admin.users.index (/admin/users)
            Route::get('/{user}', 'show')->name('show');   // admin.users.show (/admin/users/{user})
            Route::post('/', 'store')->name('store');      // admin.users.store
        });

    });

このようにチェイン状につなげることで、属性を整理しながらネスト(階層化)して定義することも可能です。

4. ルーティンググループ化のメリット

  1. コードのDRY化(重複排除) 同じミドルウェア指定やURLの記述を何度も書かずに済みます。
  2. 仕様変更に強い 例えば「管理者ページのURLを /admin から /backend に変えたい」となった時も、prefix('backend') の一箇所を変更するだけで全ルートに反映されます。
  3. 可読性の向上 どのルートに何の権限が必要なのか、どのグループに属しているのかが視覚的にわかりやすくなります。

まとめ

Laravelのルーティンググループを使いこなすことで、ルートファイルの記述量を最小限に抑え、保守性の高いアプリケーションを構築できます。

  • ミドルウェアの一括適用Route::middleware(...)
  • URLの共通化Route::prefix(...)
  • ルート名の共通化Route::name(...)
  • コントローラーの共通化Route::controller(...)

開発の初期段階からグループ化を意識して設計し、整理された綺麗な routes/web.php を保ちましょう!

コメント