laravel中间件默认生成在app/http/middleware/目录,命名空间为app\http\middleware,需实现handle方法并return $next($request),全局、分组、路由级中间件注册位置不同、生效范围各异。

php artisan make:middleware 命令生成的文件在哪
生成的中间件类默认放在 app/Http/Middleware/ 目录下,文件名按你命令里写的来,比如运行 php artisan make:middleware CheckAge,就会创建 app/Http/Middleware/CheckAge.php。
这个路径是硬编码在 Laravel 的命令逻辑里的,改不了;但你可以手动挪动文件位置,只要后续注册时用对命名空间就行——不过不建议挪,否则团队协作或升级时容易出错。
- 类必须继承
Illuminate\Http\Middleware\TrustProxies以外的基类(通常直接实现__invoke方法) - 命名空间固定为
App\Http\Middleware,除非你改了composer.json的 autoload 配置 - 如果执行命令后没看到文件,先确认当前目录是项目根目录,且
artisan可执行
中间件类里 handle 方法的三个参数怎么用
handle 方法签名是 public function handle($request, Closure $next, $parameter = null),其中:
-
$request是当前请求对象,可调$request->input()、$request->route()等 -
$next是必传的闭包,代表“放行到下一个中间件或控制器”,漏掉它就卡死请求 -
$parameter是路由定义里传进来的参数(如Route::middleware('age:18')中的18),不是所有中间件都需要,没传就是null
常见错误:有人把 $next($request) 写成 return $next($request) ——其实必须 return,否则响应为空;也有人忘了加 return,导致后续逻辑执行但响应没返回。
全局中间件、分组中间件和路由中间件的区别
注册位置不同,生效范围完全不同:
- 全局中间件写在
app/Http/Kernel.php的$middleware数组里,每个 HTTP 请求都走一遍(含 Artisan 命令触发的请求?不,仅限 HTTP) - 分组中间件在
$middlewareGroups里,比如web或api,只在对应路由组里生效 - 路由级中间件直接在
routes/web.php或routes/api.php里用->middleware('name')指定,最细粒度控制
性能影响:全局中间件哪怕某个接口完全用不上,也会初始化并执行 handle。比如你在全局加了个日志中间件,但某个健康检查接口(/ping)根本不需要,那就该挪到路由级。
中间件里 redirect() 不生效的典型原因
写 return redirect('/login'); 却跳转失败,大概率是没 return $next($request) 之后的代码,或者 redirect 被吞了。
- 必须显式
return重定向响应,不能只调redirect() - 如果中间件在
$middlewareGroups['api']里,而你返回的是 HTML 重定向,前端可能收不到跳转(API 路由默认返回 JSON) - 部分中间件(如 CORS)会修改响应头,可能覆盖掉
Location头,顺序很重要:重定向类中间件尽量靠前 - 开发时用
dd()或日志确认是否进了中间件——有时候你以为注册了,其实是拼错了中间件名
中间件链是线性的,任何一个环节没 return 响应,整个链就断在那。这点比控制器难调试,因为没报错,只有行为异常。











