路由组与中间件 #
一、路由组概述 #
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