路由组与中间件 #

一、路由组概述 #

1.1 什么是路由组 #

路由组允许你共享路由属性,如中间件、命名空间、前缀等,而不需要为每个路由单独定义。

text
路由组的作用
├── 共享中间件
├── 共享路由前缀
├── 共享命名空间
├── 共享域名约束
└── 共享子域名

1.2 基本语法 #

php
Route::group([], function () {
    // 路由定义
});

二、中间件 #

2.1 应用中间件到路由组 #

php
Route::middleware(['auth'])->group(function () {
    Route::get('/dashboard', function () {
        // 需要认证
    });
    
    Route::get('/profile', function () {
        // 需要认证
    });
});

2.2 多个中间件 #

php
Route::middleware(['auth', 'admin'])->group(function () {
    Route::get('/admin/users', function () {
        // 需要认证且是管理员
    });
    
    Route::get('/admin/settings', function () {
        // 需要认证且是管理员
    });
});

2.3 常用中间件 #

中间件 说明
auth 用户认证
guest 仅限未登录用户
verified 邮箱验证
throttle 请求频率限制
csrf CSRF保护(web路由默认)
subscribed 订阅检查

2.4 中间件参数 #

php
Route::middleware('throttle:60,1')->group(function () {
    // 每分钟最多60次请求
});

Route::middleware('role:admin,editor')->group(function () {
    // 需要admin或editor角色
});

三、路由前缀 #

3.1 URL前缀 #

php
Route::prefix('admin')->group(function () {
    Route::get('/users', function () {
        // /admin/users
    });
    
    Route::get('/posts', function () {
        // /admin/posts
    });
});

3.2 名称前缀 #

php
Route::name('admin.')->group(function () {
    Route::get('/users', function () {
        // 路由名称: admin.users
    })->name('users');
    
    Route::get('/posts', function () {
        // 路由名称: admin.posts
    })->name('posts');
});

3.3 组合前缀 #

php
Route::prefix('admin')
    ->name('admin.')
    ->group(function () {
        Route::get('/dashboard', function () {
            // URL: /admin/dashboard
            // 名称: admin.dashboard
        })->name('dashboard');
    });

四、命名空间 #

4.1 控制器命名空间 #

php
Route::namespace('Admin')->group(function () {
    // 控制器在 App\Http\Controllers\Admin 命名空间
    Route::get('/users', [UserController::class, 'index']);
});

4.2 现代写法 #

Laravel 8+ 推荐使用完整类名:

php
use App\Http\Controllers\Admin\UserController;

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

五、子域名路由 #

5.1 子域名约束 #

php
Route::domain('{account}.example.com')->group(function () {
    Route::get('/users', function ($account) {
        return "账户: {$account}";
    });
});

5.2 子域名与参数 #

php
Route::domain('{account}.app.com')->group(function () {
    Route::get('/dashboard', function ($account) {
        return "账户 {$account} 的仪表板";
    });
    
    Route::get('/users/{id}', function ($account, $id) {
        return "账户 {$account} 的用户 {$id}";
    });
});

六、路由组嵌套 #

6.1 嵌套示例 #

php
Route::middleware(['auth'])->group(function () {
    Route::prefix('admin')->name('admin.')->group(function () {
        Route::middleware(['admin'])->group(function () {
            Route::get('/users', [UserController::class, 'index'])->name('users.index');
            Route::get('/posts', [PostController::class, 'index'])->name('posts.index');
        });
    });
});

6.2 扁平化写法 #

php
Route::middleware(['auth'])
    ->prefix('admin')
    ->name('admin.')
    ->middleware(['admin'])
    ->group(function () {
        Route::get('/users', [UserController::class, 'index'])->name('users.index');
        Route::get('/posts', [PostController::class, 'index'])->name('posts.index');
    });

七、控制器路由组 #

7.1 控制器组 #

php
use App\Http\Controllers\UserController;

Route::controller(UserController::class)->group(function () {
    Route::get('/users', 'index');
    Route::get('/users/{id}', 'show');
    Route::post('/users', 'store');
    Route::put('/users/{id}', 'update');
    Route::delete('/users/{id}', 'destroy');
});

7.2 控制器组与中间件 #

php
Route::middleware(['auth'])
    ->controller(UserController::class)
    ->group(function () {
        Route::get('/profile', 'profile');
        Route::put('/profile', 'updateProfile');
    });

八、资源路由组 #

8.1 资源控制器 #

php
Route::resource('users', UserController::class);

生成的路由:

方法 URI 名称 动作
GET /users users.index index
GET /users/create users.create create
POST /users users.store store
GET /users/ users.show show
GET /users/{user}/edit users.edit edit
PUT/PATCH /users/ users.update update
DELETE /users/ users.destroy destroy

8.2 部分资源路由 #

php
// 只包含指定方法
Route::resource('users', UserController::class)->only([
    'index', 'show'
]);

// 排除指定方法
Route::resource('users', UserController::class)->except([
    'create', 'store', 'destroy'
]);

8.3 资源路由组 #

php
Route::middleware(['auth'])->group(function () {
    Route::resource('users', UserController::class);
    Route::resource('posts', PostController::class);
});

8.4 API资源路由 #

php
// 不包含 create 和 edit 视图路由
Route::apiResource('users', UserController::class);

8.5 嵌套资源 #

php
// /users/{user}/posts/{post}
Route::resource('users.posts', PostController::class);

九、中间件详解 #

9.1 创建中间件 #

bash
php artisan make:middleware CheckAge

9.2 中间件实现 #

php
// app/Http/Middleware/CheckAge.php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class CheckAge
{
    public function handle(Request $request, Closure $next)
    {
        if ($request->age < 18) {
            return redirect('home');
        }
        
        return $next($request);
    }
}

9.3 后置中间件 #

php
public function handle(Request $request, Closure $next)
{
    $response = $next($request);
    
    // 在响应发送后执行
    // 例如:记录日志
    
    return $response;
}

9.4 注册中间件 #

php
// bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
    $middleware->alias([
        'age' => \App\Http\Middleware\CheckAge::class,
    ]);
})

9.5 全局中间件 #

php
// bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
    $middleware->append(\App\Http\Middleware\CheckAge::class);
})

9.6 中间件组 #

php
// bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
    $middleware->group('web', [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ]);
})

十、中间件参数 #

10.1 定义带参数中间件 #

php
// app/Http/Middleware/Role.php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class Role
{
    public function handle(Request $request, Closure $next, ...$roles)
    {
        if (!in_array($request->user()->role, $roles)) {
            abort(403, '无权访问');
        }
        
        return $next($request);
    }
}

10.2 使用带参数中间件 #

php
Route::middleware('role:admin')->group(function () {
    // 需要admin角色
});

Route::middleware('role:admin,editor')->group(function () {
    // 需要admin或editor角色
});

十一、中间件排序 #

11.1 设置优先级 #

php
// bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
    $middleware->priority([
        \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class,
        \Illuminate\Cookie\Middleware\EncryptCookies::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \Illuminate\Contracts\Auth\Middleware\AuthenticatesRequests::class,
        \Illuminate\Routing\Middleware\ThrottleRequests::class,
        \Illuminate\Routing\Middleware\ThrottleRequestsWithRedis::class,
        \Illuminate\Contracts\Session\Middleware\AuthenticatesSessions::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \Illuminate\Auth\Middleware\Authorize::class,
    ]);
})

十二、排除中间件 #

12.1 排除特定路由 #

php
Route::middleware(['auth'])->group(function () {
    Route::get('/profile', function () {
        // 需要认证
    });
    
    Route::get('/public', function () {
        // 不需要认证
    })->withoutMiddleware(['auth']);
});

12.2 排除全局中间件 #

php
Route::get('/api/webhook', function () {
    // 排除CSRF验证
})->withoutMiddleware([\App\Http\Middleware\VerifyCsrfToken::class]);

十三、实战示例 #

13.1 后台管理路由组 #

php
Route::middleware(['auth', 'verified'])
    ->prefix('admin')
    ->name('admin.')
    ->group(function () {
        Route::get('/dashboard', [DashboardController::class, 'index'])
            ->name('dashboard');
        
        Route::middleware(['admin'])->group(function () {
            Route::resource('users', UserController::class);
            Route::resource('posts', PostController::class);
            Route::resource('categories', CategoryController::class);
        });
    });

13.2 API路由组 #

php
Route::prefix('api/v1')
    ->middleware(['throttle:60,1'])
    ->group(function () {
        Route::apiResource('users', UserController::class);
        Route::apiResource('posts', PostController::class);
        
        Route::middleware(['auth:sanctum'])->group(function () {
            Route::get('/profile', [ProfileController::class, 'show']);
            Route::put('/profile', [ProfileController::class, 'update']);
        });
    });

13.3 多租户路由 #

php
Route::domain('{tenant}.example.com')->group(function () {
    Route::middleware(['tenant.resolve'])->group(function () {
        Route::get('/', [HomeController::class, 'index']);
        Route::resource('posts', PostController::class);
    });
});

十四、总结 #

14.1 核心要点 #

要点 方法 说明
中间件 middleware() 应用中间件
前缀 prefix() URL前缀
名称 name() 路由名称前缀
域名 domain() 域名约束
控制器 controller() 控制器组
资源 resource() RESTful资源

14.2 下一步 #

掌握了路由组和中间件后,让我们继续学习 路由模型绑定,实现自动模型解析!

最后更新:2026-03-28