应使用 Route::group() 替代多个 Route::any(),因其支持统一前缀、方法约束、中间件及默认路由映射,提升可维护性与安全性;Webman 1.4+ 默认路由机制可自动解析 /api/{控制器}/{动作} 到对应控制器方法。

Webman 里大量同控制器的路由,别一个个 Route::any() 硬写,直接用路由分组 + 默认路由规则就能省掉 80% 的配置代码。
为什么 Route::group() 比一堆 Route::any() 更合适
你当前写的三行:Route::any('/test', [...]); Route::any('/test2', [...]); Route::any('/test3', [...]);,本质是把同一个控制器下的方法“平铺”注册,既难维护、又无法共享前缀和中间件,还容易漏加 POST/GET 限制。
而 Route::group() 允许你一次性声明路径前缀、HTTP 方法约束、中间件,并把控制器方法映射逻辑收口到默认路由机制里——这才是 Webman 原生支持的高效方式。
- 默认路由规则(
{控制器}/{动作})在 Webman 1.4+ 已稳定支持,且与Route::group()完全兼容 - 路由分组本身不增加运行时开销,FastRoute 编译后仍是单次匹配
- 中间件、命名空间、参数约束等可统一设置,避免重复粘贴
用 Route::group() 绑定整个控制器目录
假设你的 app\api\controller\AggregationController 类里有 test、test2、test3 三个 public 方法,想通过 /api/test、/api/test2 这类路径访问,推荐这样写:
use Webman\Route;
Route::group('/api', function () {
// 启用默认控制器路由:/api/{控制器}/{动作} → 自动映射到 app\api\controller\{控制器}Controller::action
Route::any('/{controller}/{action}', [app\api\controller\IndexController::class, 'fallback'])
->name('api.default')
->middleware(['app\middleware\ApiAuth::class']);
});
但更干净的做法是直接利用 Webman 的默认路由机制,删掉所有单条路由,只保留分组前缀,并确保控制器路径符合约定:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 把
AggregationController放在app/api/controller/目录下 - 访问
/api/aggregation/test就会自动调用app\api\controller\AggregationController::test() - 如果坚持用
/api/test这种扁平路径,需额外定义 fallback 路由或改写控制器命名(如命名为TestController)
Route::any() 的陷阱:方法不限制 = 安全隐患
你当前用的 Route::any() 表面方便,实际埋了两个雷:
- 它允许任意 HTTP 方法(包括
DELETE、PUT)打到本该只响应GET的接口上,可能绕过权限中间件或触发意外副作用 - FastRoute 在匹配
any路由时优先级低于明确指定方法的路由,一旦后续加了Route::get('/test'),就可能产生冲突或覆盖 - 调试时看不到真实请求方法,日志和监控难以区分意图
正确做法是按语义选方法:Route::get('/test', [...])、Route::post('/test2', [...]),或至少用 Route::add(['GET', 'POST'], '/test3', [...]) 显式声明。
大规模路由分组的实际组织建议
当控制器超过 10 个、路由超 50 条时,光靠一个 route.php 文件会迅速失控。推荐分层管理:
- 在
config/route.php中用glob('app/*/route.php')自动加载各模块路由文件 - 每个模块(如
app/api/route.php、app/admin/route.php)内部用Route::group()隔离作用域 - 对高频访问的聚合接口,可单独提取为
app/api/v1/route.php,配合版本前缀/api/v1 - 避免嵌套多层
group(),Webman 不支持深度嵌套,两层以内(如/admin/user+/admin/log)足够清晰
真正容易被忽略的是:路由分组的闭包函数内,Route 实例是独立作用域的,middleware() 和 name() 不会透出到外层;另外,Route::group('/prefix', [...]) 的第二个参数必须是 callable,不能传数组或字符串。


















