Laravel 11 中间件组由 bootstrap/app.php 中 withMiddleware() 预设,仅支持 web 和 api 两个固定组,不可自定义;需通过中间件别名组合使用,并显式添加 auth、throttle 等带参中间件。

Laravel 11.x 中间件组的配置方式与旧版本有本质区别:不再通过 app/Http/Kernel.php 的 $middlewareGroups 定义,而是由框架内置固定,不可自定义或覆盖。你不能像 Laravel 9/10 那样在 Kernel.php 里新增 'admin' => [...] —— 这个文件本身在 Laravel 11 中已被移除。
真正有效的做法是:
✅ 使用框架预设的中间件组入口:web 和 api
这两个字符串不再是“魔法别名”,而是明确指向 bootstrap/app.php 中注册的中间件链:
-
->middleware('web')等价于执行withMiddleware()->web([...])里声明的所有中间件 -
->middleware('api')同理,对应->api([...])注册的链
它们不包含认证逻辑(如 auth:sanctum),也不自动启用 session 或 CSRF —— 这些都需你显式添加。
✅ 自定义“类中间件组”的替代方案:用别名 + 组合调用
Laravel 11 不支持自定义中间件组数组,但你可以通过 中间件别名 + 路由批量绑定 实现等效效果:
-
在
bootstrap/app.php的withMiddleware()闭包中注册别名:$middleware->alias([ 'admin.auth' => \App\Http\Middleware\AdminAuthMiddleware::class, 'admin.check' => \App\Http\Middleware\CheckAdminRoleMiddleware::class, 'admin.session' => \Illuminate\Session\Middleware\StartSession::class, ]); -
然后在路由中组合使用(顺序敏感):
Route::middleware(['web', 'admin.session', 'admin.auth', 'admin.check']) ->prefix('admin') ->group(function () { Route::get('/dashboard', [AdminController::class, 'index']); });
⚠️ 注意:
web必须放在前面,确保 session、cookie 加密等基础能力就绪;认证类中间件(如admin.auth)必须在SubstituteBindings之后生效 —— Laravel 11 的web()链已内置SubstituteBindings,所以只要web在前,后续自定义中间件就能安全依赖路由模型绑定。
✅ 带参数的中间件不能塞进组,必须单独加在路由上
例如限流 throttle:60,1 或认证 auth:sanctum:
Route::middleware(['web', 'auth:sanctum'])
->get('/admin/settings', [SettingController::class, 'edit']);
// 或带限流
Route::middleware(['api', 'throttle:100,1'])->get('/api/v1/reports', [ReportController::class, 'index']);
这类中间件不能放进 ->web([...]) 或 ->api([...]) 的数组里,否则启动报错或静默失效。
✅ 验证是否生效
运行命令查看实际绑定的中间件:
php artisan route:list --name=admin.dashboard
输出的 Middlewares 列应显示完整列表,如:web, admin.session, admin.auth, admin.check
不复杂但容易忽略。











