直接运行 composer require nikic/fast-route 即可安装,需 php ≥ 8.1,注意手动引入 vendor/autoload.php,区分 simpledispatcher(开发用)与 cacheddispatcher(生产用,需绝对路径缓存文件),addroute 中方法名须大写、正则元字符不重复转义、处理器无空格,uri 需截断查询串、解码并清理入口脚本路径。

直接运行 composer require nikic/fast-route 就行
FastRoute 没有私有仓库、不依赖 dev 分支、也不需要额外配置镜像或 stability 选项——它就是标准 Composer 包。只要项目支持 PHP ≥ 8.1(官方推荐,低于 8.1 可能因返回类型声明报错),composer require nikic/fast-route 执行完就装好了。
常见错误现象:vendor/nikic/fast-route/src 目录不存在;或自动加载失败,报 Class "FastRoute\simpleDispatcher" not found。
- 检查是否漏了
require 'vendor/autoload.php'——FastRoute 不自动引入,必须手动加载 - 确认没在
composer.json的autoload或classmap里意外排除FastRoute\命名空间 - 运行
composer dump-autoload强制刷新映射(尤其改过 autoload 配置后)
simpleDispatcher 和 cachedDispatcher 怎么选
两者接口一致,区别只在性能和缓存行为:simpleDispatcher 每次请求都重新编译路由表;cachedDispatcher 会把编译结果写入文件(默认用 FileCache),适合生产环境。
使用场景:本地开发可先用 simpleDispatcher 快速验证;上线前务必切到 cachedDispatcher,否则路由匹配会多出 2–3ms 开销(实测 PHP 8.2 + Nginx 场景)。
-
cacheKey必须是绝对路径,比如__DIR__ . '/cache/route.cache',相对路径会导致缓存失效 - 缓存文件需 Web 服务器有写权限,否则静默降级为无缓存模式(不报错但性能掉回
simpleDispatcher) - 修改路由后要清缓存,最简单方式是删掉
route.cache文件再重试
路由定义时 addRoute 的参数陷阱
addRoute 看似简单,但三个参数的组合容易出错:HTTP 方法大小写敏感、URI 模式里正则括号要转义、处理器字符串不能带空格。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
常见错误现象:/user/{id:\d+} 匹配不到 /user/123;或 POST /login 被当成 405 Method Not Allowed。
- HTTP 方法必须大写,
$r->addRoute('get', ...)会完全不生效 - 多个方法用数组传,
['GET', 'HEAD']比重复写两行更安全(HEAD 自动 fallback 到 GET 处理器) - 占位符正则里的
+、*、?属于 PCRE 元字符,必须用{id:\d+}而不是{id:\d\+}(反斜杠多余) - 处理器写成
'App\Controller::index '(末尾空格)会导致call_user_func找不到类
为什么 parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) 不够用
直接取 $_SERVER['REQUEST_URI'] 并不做清理,会导致路由匹配失败:查询参数未剥离、URL 编码未解码、PATH_INFO 冗余路径干扰。
性能影响:少做这一步,/api/users?sort=name 会被当做成 /api/users?sort=name 去匹配,而你定义的只是 /api/users。
- 必须先用
strpos($uri, '?')截断查询字符串,否则带参数的 URI 永远不匹配 - 必须
rawurldecode(),否则/user/%E4%BD%A0%E5%A5%BD(中文路径)无法匹配/user/{name} - 如果用了 Apache 的
mod_rewrite或 Nginx 的try_files,确保入口脚本(如index.php)不在 URI 路径中,否则要手动str_replace('/index.php', '', $uri)
这些细节看着琐碎,但漏掉任意一条,路由就会在某些 URL 下静默失效——尤其是带中文、特殊符号或前端 History 模式路由时。










