webman中间件不自动叠加,全局与路由级中间件独立注册、不合并不继承;options请求需明确定义路由才能触发中间件,否则直接404。

Webman 中间件不会自动叠加执行,全局中间件和路由级中间件是两套独立注册机制,**不合并、不继承、不隐式叠加**。你看到的“跳过部分中间件”,大概率是因为只在某个层级注册了,而另一层没生效或被覆盖。
全局中间件只作用于空路由前缀('')
config/middleware.php 中定义的中间件,只对 key 为 '' 的路由组生效:
return [
'' => [
app\middleware\AccessControl::class,
app\middleware\ActionHook::class,
],
];
这意味着它仅匹配没有显式前缀的路由,比如 /、/api(如果没被任何 Route::group 包裹)。一旦你用 Route::group('/front', ...) 包裹,这个 group 就脱离了 '' 上下文,全局中间件默认不进入。
- Route::get('/user', ...) → 触发
''下的全局中间件 - Route::group('/front', function () { Route::get('/v1/xxx', ...); }) → 不触发
''下的中间件,除非你手动在 group 内再调用->middleware(...) - OPTIONS 请求(如跨域预检)必须命中某条实际路由,否则直接 404;
AccessControl若只注册在'',但请求路径是/front/v1/util/addFav,那它根本不会运行
路由级中间件按声明顺序执行,不继承父 group
Webman 的中间件链是“就近注册优先”,且 ->middleware() 是覆盖式而非追加式:
Route::group('/front', function () {
Route::group('/v1', function () {
Route::group('/util', function () {
Route::post('/addFav', [...])->middleware([app\middleware\chkLogin::class]);
})->middleware([app\middleware\userInfo::class]);
});
})->middleware([app\middleware\userInfo::class]);
上面这段代码中,最内层 /addFav 只会执行 chkLogin,**不会自动带上外层 group 的 userInfo**。Webman 不做中间件继承,每个 ->middleware() 都是独立覆盖。
- 要让
/addFav同时走userInfo和chkLogin,必须显式写成:->middleware([app\middleware\userInfo::class, app\middleware\chkLogin::class]) - 中间件数组顺序即执行顺序:先
userInfo(注入用户信息),再chkLogin(验证登录态) - 如果外层 group 的
->middleware()没写全,内层又没补,那缺失的中间件就真的不会执行
OPTIONS 请求 404 的真实原因:没匹配到对应路由
浏览器发 CORS 预检时,会发一个 OPTIONS /front/v1/util/addFav 请求。Webman 默认不会自动生成 OPTIONS 路由 —— 它只响应你明确定义的 Route::options() 或通配 method 的 Route::any()。
-
AccessControl中间件即使存在,也得先有路由才能触发它;没路由匹配,直接 404,中间件根本没机会跑 - 解决办法:在对应 group 内补一条
Route::options('/addFav', ...),或者统一用Route::any('/addFav', ...)并在中间件里判断 method - 更稳妥的做法是,在最外层 group 加一个 catch-all OPTIONS 路由:
Route::options('{all}', function () { return response('', 204)->withHeaders([...]); })->where('all', '.*');
中间件执行顺序不是靠“嵌套深度”推导出来的,而是严格依赖路由定义位置和 ->middleware() 的显式调用。最容易被忽略的是:OPTIONS 请求必须有对应路由定义,否则连中间件入口都进不去;另一个是 group 层级之间没有中间件继承关系,每一层都要自己管好自己的中间件列表。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











