中间件不生效主因是配置错误:未正确注册到Kernel.php的$middleware或$middlewareGroups数组、别名未在$routeMiddleware中映射、$middlewarePriority顺序不当、handle方法未调用$next或返回值缺失,需逐项排查并清缓存。

中间件不生效,八成是 $middlewarePriority 配置没对上,或者根本没走对注册路径。
中间件没注册到 Kernel.php 的 $middlewareGroups 或 $middleware
全局中间件必须放进 $middleware 数组,分组中间件(比如 web、api)必须放进 $middlewareGroups。如果只是写了类、没在 app/Http/Kernel.php 里声明,Laravel 根本不会加载它。
- 检查
Kernel.php中的$middlewareGroups['web']是否包含你的中间件别名(如'auth'),而不是类全名 - 确认你用的是字符串别名(
'auth'),不是类名(\App\Http\Middleware\Authenticate::class)——后者只在$middleware里合法 - 别把中间件错放到
$routeMiddleware里又没在路由中显式调用,它不会自动生效
中间件别名没在 $routeMiddleware 中注册
路由级中间件(比如 Route::get(...)->middleware('check.role:admin'))依赖 $routeMiddleware 数组做映射。如果别名没注册,Laravel 会静默忽略,不报错也不执行。
- 打开
Kernel.php,确认$routeMiddleware包含类似'check.role' => \App\Http\Middleware\CheckRole::class的映射 - 别名里不能有反斜杠或点号,只支持字母、数字、下划线、短横线
- 修改后记得清缓存:
php artisan config:clear,否则旧配置仍被读取
$middlewarePriority 顺序冲突导致覆盖或跳过
Laravel 10+ 会按 $middlewarePriority 对全局中间件重排序。如果你的中间件没出现在这个数组里,它会被排到最后;如果它依赖的前置中间件(比如 Authenticate)被排到了它后面,那它拿到的 $request->user() 就是 null。
- 查看
Kernel.php中的$middlewarePriority,确认关键中间件(如认证、授权)位置合理 - 自定义中间件若需访问用户信息,必须放在
\Illuminate\Auth\Middleware\Authenticate::class之后 - 不要删掉默认项,哪怕暂时不用——缺失会导致整个优先级链重排异常
中间件 handle 方法签名错误或提前 return
中间件逻辑写错,比如忘了调用 $next($request),或者在条件分支里漏了 return,会导致请求流中断,看起来像“没生效”,其实是被拦死了。
- 确保每个分支都有明确返回值:要么
return $next($request),要么返回响应(如return redirect(...)) - 参数类型提示要谨慎:
public function handle($request, Closure $next, $role)比public function handle(Request $request, Closure $next, string $role)更安全——后者可能因类型强制导致参数绑定失败 - 加一句
Log::debug('check.role middleware triggered');到开头,验证是否真没进方法
最常被忽略的一点:中间件是否真的被绑定了?用 php artisan route:list --name=your-route-name 看 Middleware 列,空着就说明没挂上;有内容但行为不对,再查优先级和 handle 流程。


















