必须使用 RouterContainer 初始化 Aura.Router,因其预装 Matcher、Generator 和 RouteCollector;单独 new Router 会导致匹配失败,常见 RouteNotFoundException 或 getAttributes() 返回空。

直接用 RouterContainer,别碰裸 Router
Aura.Router 的核心是匹配逻辑,但单独 new Router 会缺 matcher 和 generator,导致路由注册后根本 match 不出来。必须用 RouterContainer——它预装了 Matcher、Generator 和默认的 RouteCollector,省去手动拼接的麻烦。
常见错误现象:RouteNotFoundException 即使路径和方法完全匹配;或者 $route->getAttributes() 返回空数组,但 URL 明明带 /user/123。
- 安装命令固定为:
composer require aura/router(无版本后缀,v3.x 是当前稳定主线) - 实例化只写这一行:
$container = new \Aura\Router\RouterContainer(); - 后续所有操作都从
$container->getRouter()和$container->getMatcher()获取对象,不自己 new
allows('GET') 不是可选项,是必填项
Aura.Router 默认对未声明 allows() 的路由放行所有 HTTP 方法,这在生产环境等于把 POST 接口暴露给 GET 请求,极易被绕过或触发非预期行为。
使用场景:API 路由必须精确控制方法;Web 页面路由通常只需 GET;表单提交要显式加 POST 或 PUT。
- 正确写法:
$router->add('user-update', '/user/{id}')->allows('PUT'); - 错误写法:
$router->add('user-update', '/user/{id}')(没声明方法,GET/POST/DELETE 全部命中) - 多个方法用数组:
->allows(['POST', 'PUT']),但注意顺序无关,不支持->allows('POST|PUT')
匹配时必须传入 REQUEST_METHOD,不能只靠 REQUEST_URI
Aura.Router 不读 $_SERVER,也不解析 $_GET 或 $_POST。它只做纯路径 + 方法匹配,参数提取全靠你传进去的原始字符串和方法名。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
容易踩的坑:本地用 PHP 内置服务器(php -S)时,$_SERVER['REQUEST_URI'] 带查询参数(如 /user/123?id=456),但 Aura.Router 只认路径段,?id=456 会被忽略——这不是 bug,是设计如此。
- 匹配调用必须两参数:
$matcher->match($_SERVER['REQUEST_URI'] ?? '/', $_SERVER['REQUEST_METHOD'] ?? 'GET') - 如果用了 Nginx/Apache,确保伪静态规则把所有请求转给
index.php,且不丢REQUEST_METHOD - 路径中带查询参数?先用
parse_url($uri, PHP_URL_PATH)提取干净路径再传给match()
分发前检查 $match !== null,别假设一定有结果
匹配失败返回 null,不是异常。很多开发者直接 $match->getAttributes(),结果触发 Fatal error: Call to a member function getAttributes() on null。
性能影响:match() 是 O(1) 查表(内部用 FastRoute 编译的正则缓存),但空匹配不处理就 crash,比 404 更糟。
- 必须加判空:
if ($match === null) { http_response_code(404); exit('Not Found'); } -
$match->getName()可用于 switch 分发,但 name 必须在add()时指定,否则为null - 不要试图从
$match里取原始请求数据(如 body、headers),它只含路由层信息:name、path、attributes、methods
最易被忽略的一点:Aura.Router 对路由前缀(比如整个项目部署在 /admin 下)完全无感知。你得手动截掉前缀再传给 match(),或用 addResource() 构建层级结构——但后者要求你接受它生成的固定命名规则,灵活性反而下降。


















