composer不提供路由功能,需按需求选库:教学用macaw、轻量psr项目用mezzio+fastroute、企业级用symfony routing;装后须配置web服务器伪静态并编写入口转发逻辑。

Composer 装路由组件,不是装“一个路由”,而是选对库再装
Composer 本身不提供路由功能,它只是帮你把别人写好的路由库拉进项目。所以关键不是“怎么装”,而是“装哪个”。Symfony Routing、Mezzio Router、Macaw、FastRoute——它们定位完全不同:symfony/routing 是全功能、可配置、支持缓存的工业级方案;mezzio/mezzio-fastroute 是 PSR-15 中间件生态下的轻量集成;而 noahbuscher/macaw 就是单文件、无依赖、适合教学或极简脚手架的玩具级选择。
如果你只是想快速跑通一个 GET /hello → echo "ok",别碰 Symfony;但如果你后续要加路由缓存、主机匹配、正则约束、多格式配置(YAML/XML/注解),那 symfony/routing 才是唯一合理起点。
- 新手试水:用
composer require noahbuscher/macaw,5 分钟跑起来,但别指望它处理复杂需求 - 现代 PHP 项目(尤其带中间件):选
composer require mezzio/mezzio-fastroute,和 PSR-7/PSR-15 天然对齐 - 企业级或 Symfony 生态项目:直接
composer require symfony/routing,别省这一步
Windows 下装完 Composer 却运行不了 composer require?检查三件事
常见现象是命令行输入 composer --version 报 “不是内部或外部命令”,或者装完 symfony/routing 后 require 报错找不到类——根本原因几乎全是环境没理清。
- PATH 没生效:安装时勾了 “Add to PATH” 也不代表立刻可用,必须新开一个命令提示符或 PowerShell 窗口再试
- PHP 版本太低:
symfony/routingv6+ 要求 PHP ≥ 8.1,mezzio/mezzio-router也已放弃 PHP 7.x,用php -v确认真实版本 - 证书报错(Windows 常见):如果
composer require卡在 “Connection timed out” 或 “SSL certificate problem”,大概率是 PHP 缺 CA 证书。去 curl 官网下载 cacert.pem,然后在php.ini里补上openssl.cafile="D:/path/to/cacert.pem",重启 Web 服务
装了路由库却 404?你可能漏掉了请求入口转发
路由组件只负责“解析 URL 并返回控制器/回调”,它不启动 HTTP 服务,也不接管 Web 服务器请求。所以即使 composer require symfony/routing 成功、代码也写了 $matcher->match('/test'),浏览器直接访问 /test 依然 404——因为 Apache/Nginx 根本没把请求转给你的 PHP 脚本。
必须做两件事:
- Web 服务器配置伪静态:Apache 加
.htaccess,Nginx 配try_files $uri /index.php?$query_string; - 所有请求最终落到同一个 PHP 入口文件(比如
public/index.php),并在其中手动调用路由匹配逻辑。没有这层胶水代码,路由库就是个摆设
用 PHP 内置服务器测试时更易踩坑:php -S 127.0.0.1:8000 public/router.php 的路由规则和 Apache 完全不同,Macaw::get('test', ...) 在内置服务器里得写成 Macaw::get('/test', ...) 才生效。
为什么推荐从 FastRoute 开始配轻量路由?它真不依赖框架
很多人想“不用 Symfony 也能用它的路由”,但 symfony/routing 虽然可单独用,实际需要手动搭缓存、loader、generator,配置成本远超收益。而 fast-route(通过 mezzio/mezzio-fastroute 封装)是真正开箱即用的零配置方案。
它核心就两个操作:addRoute() 注册,dispatch() 匹配,返回数组含 handler 和 vars。没有 YAML 解析器、没有注解扫描、不读配置文件,也没有 RouteCollection 这类抽象概念。
- 性能高:编译为 PHP 数组,无运行时解析开销
- 体积小:核心逻辑不到 300 行,容易审计、调试、魔改
- 兼容强:PHP 7.4+ 直接跑,连 PSR-7 都不是必须的,自己用
$_GET/$_SERVER['REQUEST_URI']也能喂数据进去
真正复杂的不是“怎么装”,而是“怎么让路由结果变成可执行的逻辑”。那个 handler 是字符串、数组还是闭包,取决于你怎么设计后续调度——这点没人替你决定,也最容易被忽略。











