FastRoute需手动处理dispatch()返回的三态结果:NOT_FOUND、METHOD_NOT_ALLOWED、FOUND;必须用switch分支分别处理,FOUND时才调用handler并传入参数,且路径须预处理(剥离查询串、URL解码、截断base path)。

FastRoute 不是“装上就能跑”的路由框架,它只做一件事:给你一个匹配结果。你得自己写分发逻辑,否则 dispatch() 返回的数组永远躺在那儿没人处理。
composer require nikic/fast-route 装完就报 Class not found?
最常见原因是漏了这行:require 'vendor/autoload.php';。nikic/fast-route 不自动加载,必须手动引入。
- 确认
vendor/nikic/fast-route/src/目录存在(不是空的) - 检查
composer.json的autoload段有没有误删或覆盖psr-4映射 - 执行
composer dump-autoload强制刷新自动加载映射 - PHP 版本必须 ≥ 8.1 —— v2.x 用到了返回类型声明,7.x 或 8.0 下会直接 fatal error
simpleDispatcher() 里 addRoute() 写法错在哪?
HTTP 方法名必须全大写字符串:'GET'、'POST',写成 'get' 或 'Get' 就完全不匹配。
- 路径变量语法固定为
{id:\d+},不支持 Laravel 风格的{id?}或 Symfony 的{id} -
addRoute()第三个参数(handler)可以是字符串'UserController::list'、数组[$controller, 'method'],但不能是带空格的字符串如'UserController :: list' - 别在闭包里写业务逻辑,比如
$r->get('/user', function () { echo 'hi'; });—— 这会让后续统一中间件、错误处理、日志埋点变得困难
dispatch() 返回值为什么没执行 handler?
dispatch() 只返回三元数组,从不调用任何回调。这是 FastRoute 的设计契约,不是 bug。
-
$routeInfo[0]是状态码:FastRoute\Dispatcher::FOUND、NOT_FOUND、METHOD_NOT_ALLOWED -
$routeInfo[1]在FOUND时是 handler(字符串或数组),在METHOD_NOT_ALLOWED时是允许的方法列表(如['GET', 'HEAD']) -
$routeInfo[2]是绑定参数,如['id' => '123'],仅在FOUND时有效 - 必须手动
switch处理三种状态,FOUND分支里才该调用call_user_func($handler, $vars)或类似逻辑
PSR-7 请求路径怎么传给 dispatch()?
直接用 $request->getUri()->getPath() 很可能出错——它没去掉入口脚本路径(如 /index.php)和 base path(如部署在 /api/v1 下)。
- 正确做法是先截断:
$path = ltrim($request->getUri()->getPath(), $basePath); - 避免用
$_SERVER['PATH_INFO'],Nginx + PHP-FPM 下它常为空或不可靠 - 确保路径已 URL 解码(
rawurldecode()),否则含中文或特殊字符的路径会匹配失败 - 查询参数(
?foo=bar)必须提前剥离,dispatch()只认路径部分
真正卡住人的地方从来不是安装命令,而是把 dispatch() 的返回值从数组变成实际执行的那几行 switch;还有就是路径预处理——少一次 ltrim(),整个路由表就全 404。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











