laravel中间件失效主因是注册位置错误或handle()未显式返回:全局中间件须放$middleware,分组中间件(如web/api)须配$middlewaregroups并绑定路由,自定义中间件需在$routemiddleware注册别名;调用时middleware()只接受字符串或数组,带参中间件须在handle()声明对应参数,且必须return $next($request)或响应对象。

不是 Laragon 的问题,是 Laravel 中间件注册或调用方式不对。Laragon 只是本地开发环境(类似 XAMPP),它不干预 Laravel 的中间件逻辑;所谓“报中间件错”,99% 是 Kernel.php 配置错误 或 handle() 方法没正确返回 导致的请求中断、空白页、404/500 静默失败。
检查 Kernel.php 的三处关键配置
打开 app/Http/Kernel.php,重点核对以下三块数组:
-
$middleware:放全局中间件(如日志、CORS、维护模式)。顺序即执行顺序,靠前的先执行。别把依赖 session 或 auth 的中间件(比如
Authenticate)塞到这里最开头,否则$request->user()会是null。 -
$middlewareGroups:比如
'web'和'api'组。确保你路由用的是Route::middleware('web')或属于routes/web.php(默认已套 web 组),否则像StartSession、VerifyCsrfToken就不会生效,后续中间件可能因缺 session 报错。 -
$routeMiddleware:自定义中间件必须在这里注册别名,格式为
'check.role' => \App\Http\Middleware\CheckRole::class。别名不能含空格或特殊字符,也不能覆盖内置名(如别起名auth会干掉原生认证)。
路由调用中间件时的常见写法错误
即使 Kernel 配好了,路由写错也白搭:
- 用了
->middleware('check.role'),但$routeMiddleware里没注册check.role别名 → 不执行,无报错,静默失效。 - 写了多个中间件却漏了中括号:
->middleware('auth', 'throttle')错!正确是->middleware(['auth', 'throttle']),否则只认第一个。 - 带参数的中间件写成
->middleware('role:admin'),但中间件handle()方法没声明第三个参数$roles→ 报Missing argument错误。
中间件 handle() 方法必须显式返回
这是最常踩的坑:页面卡住、没响应、控制台无错误,十有八九是这里断掉了。
- 放行请求:必须写
return $next($request),只写$next($request)不加return就会中断整个链。 - 拦截请求:要返回一个响应对象,例如
return response('Forbidden', 403)或return redirect('/login')。写die('no')、exit或空return都会导致 Laravel 后续流程崩溃。 - 调试建议:在
handle()开头加一行\Log::debug('CheckRole hit');,然后访问路由,再看storage/logs/laravel.log是否有这条记录,快速确认中间件是否被触发。
验证实际生效顺序的唯一方法
别猜、别凭感觉,用命令看真实绑定结果:
php artisan route:list --middleware
这条命令会列出每条路由实际加载的中间件及其顺序,包括去重后的最终结果。如果某中间件没出现,说明它根本没注册成功或没被调用;如果顺序和你预期不符,就回头检查它在 $middleware、$middlewareGroups、路由定义三处的位置。











