phpEnv运行Mezzio报错主因是Web服务器未正确转发请求至public/index.php,需配置Apache重写规则或Nginx try_files,并确保ErrorHandler注册在路由中间件之后、分发中间件之前。

phpEnv 能跑 Mezzio,但默认配置下会直接报错——不是框架问题,而是 phpEnv 的 Apache/Nginx 默认不转发 public/index.php 以外的路径,而 Mezzio 依赖 PSR-7 URI 解析和路由匹配,必须让所有请求都经由入口文件。
phpEnv 启动后访问 404 或 “Class Mezzio\Application not found”
这是最常见现象,本质是 Web 服务器没把请求正确代理给 Mezzio 入口。phpEnv 自带的 Apache 配置默认只响应 public/ 目录下的静态文件,public/index.php 虽能执行,但 FastRouteRouter 拿不到完整 PATH_INFO,导致路由全 404;更糟的是,若 vendor/autoload.php 没加载成功,就会直接抛出类未找到错误。
- 确认已执行
composer install,且vendor/autoload.php存在(别信 gitignore 里删掉的 vendor) - 进 phpEnv 控制台 → 站点管理 → 编辑你的站点 → 在「伪静态规则」栏粘贴以下 Apache 规则(适用于 phpEnv 内置 Apache):
RewriteEngine On RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule ^.*$ /public/index.php [NC,L] - 若用 Nginx 模式(phpEnv 支持),则需手动编辑
nginx.conf对应 server 块,加 location 块:location / { try_files $uri $uri/ /public/index.php?$query_string; } - 改完重启 phpEnv 的 Web 服务(不是重启整个软件)
Mezzio 在 phpEnv 中无法解析 {id} 这类路由变量
FastRouteRouter 默认把 /user/{id} 当作字面量字符串,不启用占位符匹配。phpEnv 本身不干预路由逻辑,但开发者常误以为“本地跑通了”,其实是没触发路由匹配就 404 了,根本没走到中间件层。
- 必须显式添加正则约束,例如
/user/{id:\d+}或/user/{id:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}} - 不要依赖
$router->get()这类快捷方法自动补约束——它们只是语法糖,底层仍走 FastRoute 的 pattern 解析 - 调试时在中间件里 dump
$request->getUri()->getPath()和$request->getAttribute('route'),确认是否拿到 RouteResult 实例
phpEnv 下 Mezzio 错误中间件不生效,异常仍显示原始 PHP 错误页
这跟 phpEnv 无关,而是 Mezzio 的错误管道没配对。phpEnv 只提供运行环境,错误处理完全由 Mezzio 的 pipeline.php 控制。常见错误是把 ErrorHandler::class 注册在了主 pipeline 末尾,但它必须插在路由分发之间。
立即学习“PHP免费学习笔记(深入)”;
- 检查
config/pipeline.php:确保$app->pipe(ErrorHandler::class)出现在$app->pipeRoutingMiddleware()之后、$app->pipeDispatchMiddleware()之前 - 开发环境默认启用
WhoopsErrorHandler,它会拦截并渲染彩色堆栈,掩盖你自定义的 JSON 格式化逻辑;上线前务必在config/autoload/error-handler.global.php中设'whoops' => false - HTTP 异常如
NotFoundException在 Mezzio <4.9 中不会被默认ErrorHandler捕获,需手动判断类型或升级框架
真正卡住人的地方不在 phpEnv,而在 Mezzio 的三层中间件生命周期:路由前、路由中、路由后。一个中间件放在 pipe() 还是 add(),决定它是否能看到 $request->getAttribute('route')。这点在 phpEnv 里不会报错,只会静默失效。



















