psr-15中间件可在php 8.5运行,但依赖框架支持而非php版本;需实现middlewareinterface与requesthandlerinterface,process方法必须返回responseinterface,且不可动态属性赋值。

PHP 8.5 本身不内置中间件机制,PSR-15 中间件能否用,取决于你用的框架是否支持——不是 PHP 版本决定的。
PSR-15 中间件在 PHP 8.5 下能跑吗?
能,但和 PHP 8.5 没直接关系。PSR-15 是接口规范,只要你的 HTTP 消息库(比如 nyholm/psr7)和框架(如 slim/slim、laminas/laminas-stratigility)支持 PSR-15,并且它们兼容 PHP 8.5,中间件就能正常工作。
- PHP 8.5 只是提供了更严格的类型检查、只读类等特性,可能让中间件代码更健壮,但不提供
MiddlewareInterface或RequestHandlerInterface - 常见报错
Class "Psr\Http\Server\MiddlewareInterface" not found,本质是没装 PSR-15 的桥接包(如psr/http-server-middleware),不是 PHP 版本问题 - PHP 8.5 禁用了动态属性,默认会报
Deprecated: Creation of dynamic property,如果你在中间件里给$this->request赋值又没声明属性,就会触发警告
写一个最简 PSR-15 中间件要注意什么?
核心是实现两个接口:必须有 process() 方法,且必须返回 ResponseInterface;不能漏掉 RequestHandlerInterface 的依赖注入逻辑。
- 别把
RequestHandlerInterface当成可选参数——它必须作为第二个参数传入process(),否则不符合 PSR-15 - 中间件里不能直接
echo或exit,所有输出必须通过返回ResponseInterface实例完成 - 如果要修改请求(比如加 header、解析 body),得用
$request->withHeader()这类不可变方法,再把新请求传给下一个处理器:$handler->handle($newRequest) - 示例骨架:
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; class CorsMiddleware implements MiddlewareInterface { public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $response = $handler->handle($request); return $response->withHeader('Access-Control-Allow-Origin', '*'); } }
为什么 Slim 4 / Laminas Stratigility 能用,但原生 PHP 不能?
因为 PSR-15 是“协议”,不是“运行时”。它规定了中间件长什么样、怎么调用,但不规定谁来按顺序调用它们。
立即学习“PHP免费学习笔记(深入)”;
-
slim/slim提供了App和RouteCollector,内部用栈式调度器执行中间件链 -
laminas/laminas-stratigility提供了MiddlewarePipe,负责把多个MiddlewareInterface实例串起来 - 纯 PHP CLI 或 FPM 脚本没有请求生命周期管理,你写了
process()也没人调用它——得靠框架或自研调度器驱动 - 别试图在
index.php里手动写(new CorsMiddleware())->process($req, $handler),那只是单次调用,不是“中间件系统”
真正容易被忽略的是:PSR-15 中间件的执行顺序完全由框架控制,而框架对“全局中间件”“路由级中间件”“错误中间件”的注册时机和优先级处理差异很大。比如 Slim 4 的 add() 是先进后出(栈),而 Stratigility 的 pipe() 是先进先出(队列)——不看文档直接搬代码,请求可能根本进不到你的中间件里。











