Laravel中间件组需先在Kernel.php的$middlewareGroups中注册组名与中间件数组,再于路由中用Route::middleware('组名')->group()调用,顺序、命名空间和大小写必须严格匹配。

旧版 Laravel(如 5.8–8.x)中配置 middlewareGroups 的核心逻辑和现代版本一致,关键在于必须先注册、再引用,不能在路由文件里直接定义组名。它不是“旧版特有功能”,而是 Laravel 中间件分组机制的稳定设计,至今未变。
第一步:在 Kernel.php 中注册中间件组
打开 app/Http/Kernel.php,找到 $middlewareGroups 数组(不是 $middleware)。新增一个键值对,键为组名(字符串),值为中间件类名数组:
- 组名必须是合法字符串,比如
'admin',不能是数字索引或空格 - 每个中间件类路径要写全,例如
\App\Http\Middleware\CheckAdminRole::class - 顺序很重要:鉴权类(如
AuthMiddleware)应放在SubstituteBindings::class之后,确保路由参数已解析 - 基础功能中间件别漏掉,比如
StartSession::class(否则 session() 不可用)、VerifyCsrfToken::class(web 组必需)
第二步:在路由中正确调用中间件组
注册完成后,在 routes/web.php 或 routes/api.php 中使用 Route::middleware('admin')->group(...):
- 语法必须是
Route::middleware('组名'),不是->middleware('组名')单独链式调用(后者无效) - 中间件组名必须与
$middlewareGroups中的键完全一致,大小写敏感 - 组内所有路由(包括
Route::resource()生成的全部 7 个动作)自动继承该组中间件
常见错误与避坑点
这些在旧版中高频出现,且容易调试失败:
- 把中间件组写进
$middleware全局数组——会导致所有请求(包括静态资源、健康检查)都被拦截 - 中间件类名拼错或漏掉命名空间前缀,如写成
CheckAdmin::class而非\App\Http\Middleware\CheckAdmin::class - 在路由闭包里试图动态加中间件,例如
function () { middleware(['auth']); }—— 完全不生效 - 误以为
middleware('admin')可以直接用于单个路由(如Route::get(...)->middleware('admin')),其实可以,但推荐统一用 group 管理,避免遗漏
典型旧版配置示例(Laravel 6/7/8 兼容)
在 Kernel.php 中添加:
'web' => [
// ...原有中间件
'admin' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class,
\App\Http\Middleware\AuthenticateAdmin::class,
\App\Http\Middleware\CheckAdminRole::class,
],
],
];
在 routes/web.php 中使用:
Route::get('/dashboard', [DashboardController::class, 'index']);
Route::resource('settings', SettingController::class);
});



















