
Webman 路由注册顺序导致匹配失败
Webman 的路由是按注册顺序**从上到下逐条匹配**的,一旦某条规则命中,后续规则就不再检查。很多人把 GET /user/{id} 放在 GET /user/list 后面,结果所有 /user/list 请求都被前者的通配符捕获,返回 404 或参数解析错误。
实操建议:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 把更具体的路由(如带固定路径段的)写在前面,通配符路由(含
{id}、{any})写在后面 - 用
var_dump($router->getRoutes())查看当前已注册的路由列表和顺序(需在服务启动后、请求前调用) - 避免用
GET /{name}这类宽泛规则兜底,除非你明确控制了$name的取值范围
HTTP 方法与路由定义不一致
常见现象:浏览器直接访问 /api/login 显示 405 Method Not Allowed,但 Postman 用 POST 却能成功;或前端发 POST 请求,后端却只定义了 GET 路由。
原因在于 Webman 对方法敏感,$router->get() 和 $router->post() 完全不互通,且不自动 fallback。
实操建议:
- 检查控制器方法是否加了
@method("POST")注解(如果用了注解路由),或确认$router->post()是否被正确调用 - 用
curl -X POST http://127.0.0.1:8787/api/login手动验证,排除前端 JS 发送逻辑干扰 - 若需同时支持 GET/POST,必须显式注册两条路由,或改用
$router->addRoute(['GET', 'POST'], '/path', ...)
中间件提前终止请求导致路由未执行
比如在全局中间件里写了 if (!auth()) { return response()->json(['code'=>401]); },但没加 return $next($request);,会导致请求在中间件就结束,根本不会走到路由分发环节——此时日志里看不到路由匹配日志,也查不到控制器调用痕迹。
实操建议:
- 检查中间件末尾是否漏掉
return $next($request);,尤其是条件分支多的鉴权或 CORS 中间件 - 临时注释掉中间件数组(
config/middleware.php中的global列表),确认问题是否消失 - 在中间件开头加
var_dump(__METHOD__, $request->getUri()->getPath());,确认它是否被触发以及何时退出
路由参数绑定与类型约束冲突
定义了 GET /article/{id:\d+},但实际访问 /article/abc 时,Webman 默认不会跳过该路由去匹配下一条,而是直接返回 404 —— 因为正则不匹配,但它仍算“参与了匹配”,只是失败了。
这容易让人误以为是路由没注册,其实它是注册了,只是卡在参数校验环节。
实操建议:
- 去掉参数正则(如改成
{id}),先确认路由能否通,再逐步加约束 - 用
php webman start -d启动调试模式,观察控制台输出的「Matched route」或「No route matched」提示 - 避免对同一路径同时设置多个带不同正则的路由(如
{id:\d+}和{slug:[a-z\-]+}),Webman 不会自动区分语义,只按顺序硬匹配
var_dump($router->getRoutes()) 输出是否符合预期,比盲调配置快得多。


















