Mezzio是基于PSR-15的PHP微框架,需通过composer create-project mezzio/mezzio-skeleton安装,中间件必须实现MiddlewareInterface或带类型提示的匿名函数,且须显式注册;路由中间件顺序影响执行逻辑,开发应使用composer serve而非php -S。

Mezzio(原名 Expressive)不是“PSR-15_Mezzo”中间件——这个名称不存在,是混淆了 PSR-15、Mezzio 项目名和可能的拼写错误。你实际要配的是 Mezzio(基于 PSR-15 的 PHP 微框架),它本身就是一个 PSR-15 中间件应用容器。
确认安装的是官方 Mezzio 而非拼写变体
常见错误是 Composer 安装时输错包名,比如 mezzo、psr15-mezzo 或 expressive-middleware —— 这些都不是合法包。正确命令只有一条:
composer create-project mezzio/mezzio-skeleton myapp
安装后检查 vendor/mezzio/ 下是否存在 mezzio/mezzio 和 mezzio/mezzio-router 等核心包。若看到 mezzio/mezzio-swoole 或 mezzio/mezzio-laminasrouter,说明环境正常;若报 Package mezzio/mezzo not found,就是输错了。
中间件必须实现 MiddlewareInterface 才能被 Mezzio 调用
Mezzio 不接受任意闭包或普通函数作为中间件。哪怕只做日志,也必须包装成符合 PSR-15 的类或可调用对象:
立即学习“PHP免费学习笔记(深入)”;
- 类需实现
Psr\Http\Server\MiddlewareInterface,且process()方法签名严格为process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface - 匿名函数必须显式绑定类型提示(PHP 7.4+ 支持),例如:
function (ServerRequestInterface $req, RequestHandlerInterface $next): ResponseInterface { ... } - 使用
Mezzio\Helper\ServerUrlHelper等辅助工具前,得先通过$request->getAttribute('server_url_helper')获取,不能直接 new
路由中间件注册顺序直接影响执行逻辑
Mezzio 的中间件分三层:程序级(全局)、路由级(匹配后)、委托级(最后兜底)。错误常出在把耗时中间件(如 JWT 验证)放在路由定义里,导致未匹配路由也触发验证:
- 全局中间件(如 CORS、日志)注册在
Application::pipe(),对所有请求生效 - 路由专属中间件(如权限检查)应写在
$app->post('/api/user', ...)->add(AuthMiddleware::class),仅对该路由起作用 -
$app->pipeRoutingMiddleware()和$app->pipeDispatchMiddleware()是 Mezzio 内置的路由分发胶水,不能删也不能重排位置 - 若用
laminas-router,注意RouteCollector默认不启用trailing-slash,/user和/user/被视为不同路由
开发时别依赖 public/index.php 直接运行
Mezzio 默认不带内置服务器,php -S localhost:8080 public/index.php 会因缺少 PSR-7 请求解析而报 Missing header: Host 或空响应。正确做法是:
- 用
composer serve(需安装mezzio/mezzio-swoole或mezzio/mezzio-aurarouter对应的 dev-server) - 或用 Laravel Valet、Docker(推荐
php:8.2-apache镜像 +.htaccess重写) - 调试中间件执行流时,在
process()开头加var_dump($request->getUri()->getPath()); exit;比看日志更快定位是否进入某一层
真正容易卡住的地方,是认为「写了中间件类就能自动运行」——Mezzio 不扫描目录,每个中间件都得显式 pipe() 或 add();还有人把 PSR-15 和 PSR-7 混为一谈,试图传原生 $_GET 给 process(),这会导致类型错误直接中断。



















