hyperf中间件顺序不生效主因是server名不匹配或未设优先级数值;server名须与server.php中完全一致,中间件顺序由数值决定而非数组顺序,routermiddleware必须设最高优先级。

Hyperf 中间件顺序不生效,基本就是 server 名没对上,或者优先级数值没设——不是你写错顺序,是框架根本没加载那组配置,或加载了但按数值重排了。
server 名必须完全匹配,大小写和空格都算数
Hyperf 的 middlewares.php 是按 server 名分组生效的,不是全局通用。它只认 config/autoload/server.php 里 servers 数组中每个元素的 name 值。
- 如果你的
server.php里写的是'name' => 'api',那middlewares.php中就必须有'api' => [],写成'http'或'API'都不会加载 -
'http'只在server.php显式定义了'name' => 'http'时才生效,不是默认兜底名 - 配置键名不匹配时,Hyperf 完全静默跳过,日志里不会报错,也看不到中间件执行痕迹
数组顺序无效,必须显式写优先级数值
Hyperf 2.2+ 起,中间件执行顺序由优先级数值决定,不是 middlewares.php 里数组的书写顺序。哪怕你把 AuthMiddleware 放第一位,没给数值就等于默认 0,可能被其他带 => 10 的中间件插队。
- 正确写法是:
\App\Middleware\AuthMiddleware::class => 10,数值越大,请求阶段越早执行 - 不写数值(如直接写
\App\Middleware\LogMiddleware::class)等价于=> 0 - 同优先级时才 fallback 到数组顺序,但别依赖这个行为
- 注解方式
#[Middleware(AuthMiddleware::class, 10)]和路由级->middleware([])同样遵循该规则
RouterMiddleware 必须排在最前面
如果请求进来直接 404,或者 $request->getAttribute('route') 是 null,大概率是 RouterMiddleware 被挡在了后面。
-
\Hyperf\HttpServer\Middleware\RouterMiddleware::class不是可选组件,它是路由解析的唯一入口 - 所有依赖
route属性的中间件(比如鉴权、权限、日志记录路由路径)都必须在它之后 - 错误示例:
AuthMiddleware在RouterMiddleware前 → 拿不到 route → 可能直接 throw 异常或返回 401 - 建议把它固定设为最高优先级,比如
=> 999
最容易被忽略的其实是 server 名配对问题——它不报错、不警告、不提示,只是让整组中间件彻底失效。确认顺序前,先打开 server.php 和 middlewares.php 并排对比,一个字符都不能差。











