中间件必须显式注册才能生效,光生成类文件不注册等于没写;Laravel中php artisan make:middleware生成的文件固定在app/Http/Middleware/目录下,handle()方法必须return $next($request),否则请求卡死;路由中间件别名需在Kernel.php的$routeMiddleware中手动注册,键为字符串、值为完整命名空间类名。

中间件必须显式注册后才能生效,光生成类文件不注册等于没写。
php artisan make:middleware 生成的文件在哪
执行 php artisan make:middleware CheckAge 后,文件会固定生成在 app/Http/Middleware/CheckAge.php。这个路径由 Laravel 内部硬编码决定,不能通过命令参数修改。如果你在项目根目录外执行、或当前目录不是 Laravel 项目根目录,文件不会出现——先确认 artisan 命令能正常运行(比如试下 php artisan list)。
handle 方法里漏 return $next($request) 就卡死
这是最常踩的坑:中间件逻辑写完后忘了放行,或者把 $next($request) 当普通函数调用而不加 return。结果就是请求挂起、浏览器一直转圈、日志里也看不到错误。
-
return redirect('/login')这类提前终止可以不调$next - 但只要你想让请求继续往下走,就必须写
return $next($request)——少一个return,整个链就断了 - 别写成
$next($request); return response(...),那样$next执行了但响应被覆盖,控制器压根不会运行
路由中间件别名必须在 Kernel.php 的 $routeMiddleware 里注册
直接在路由里写 ->middleware('check.age') 却报错 “Undefined middleware”,基本是因为没注册别名。别名不是自动推导的,必须手动加进 app/Http/Kernel.php 的 $routeMiddleware 数组:
protected $routeMiddleware = [
'check.age' => \App\Http\Middleware\CheckAge::class,
];
注意几点:
- 键名(如
'check.age')是路由里写的字符串,值必须是完整命名空间类名 - 别写错类名,比如漏掉
\App\Http\Middleware\前缀,或大小写不一致(PHP 是大小写敏感的) - 改完
Kernel.php不需要清缓存也能立即生效,但建议顺手跑一次php artisan route:clear防意外
中间件组里不能直接写带参中间件
想在中间件组(比如 'admin' 组)里用 throttle:60,1?不行。Laravel 的 $middlewareGroups 只接受无参的类名字符串。带冒号参数的写法(如 'throttle:60,1')只能出现在路由级调用中。
正确做法:
- 在
$middlewareGroups里只放纯类名:\App\Http\Middleware\CheckAdmin::class - 需要限流时,在具体路由上单独加:
->middleware(['admin', 'throttle:60,1']) - 如果硬要塞进组里,得自己封装一个无参中间件类,内部再调用带参逻辑——但没必要,反而绕远
真正容易被忽略的是:中间件组的执行顺序和全局中间件一样严格依赖数组顺序,鉴权类(如 AuthMiddleware)一定要放在依赖用户对象的中间件之前,否则 $request->user() 是 null。


















