thinkphp 8.0必须严格遵循psr-3/7/11/15等规范:需确保6个psr包完整安装;日志须用psr-3接口或facade适配;中间件须实现psr-15接口并重写process方法;请求响应须使用psr-7标准对象。

将ThinkPHP项目升级到8.0版本后,必须让代码真正遵循PSR-3日志、PSR-7请求响应、PSR-11容器、PSR-15中间件等规范,否则第三方组件无法注入、日志写入失败、中间件不执行,甚至出现Class not found或空响应。
确认PSR依赖已完整加载
执行composer show | grep psr,检查输出中是否同时存在psr/log、psr/http-message、psr/container、psr/http-server-middleware、psr/simple-cache、psr/http-factory共6个包;缺任一包都意味着PSR生态链断裂,【TP8的中间件管道和日志通道将直接失效】。
若发现psr/log版本为composer require psr/log:^2.0 psr/http-message:^1.0 --update-with-dependencies强制升级——旧版PSR接口缺少withStatus()、withAddedHeader()等关键方法,会导致Response对象无法被框架识别。
删掉runtime/目录后执行php think optimize:schema,触发容器自动扫描并注册所有PSR标准接口实现类。
重写日志调用以兼容PSR-3
方法一:使用标准LoggerInterface注入(推荐)
在控制器构造函数中声明:public function __construct(private \Psr\Log\LoggerInterface $logger) { },后续直接调用$this->logger->info('用户登录', ['uid' => 1001])。
方法二:通过Facade适配(过渡方案)
替换think\Log::info()为think\facade\Log::info(),该Facade底层已桥接至PSR-3 Logger实例;但注意Log::write()等非标准方法已被移除,强行调用会抛出BadMethodCallException。
⚠️关键提醒:config/log.php中'default'必须设为已注册的驱动名(如'single'),否则LoggerInterface注入时容器无法解析具体实现,报错“no entry found for Psr\Log\LoggerInterface”。
重构中间件以符合PSR-15规范
第一步:确认中间件类实现Psr\Http\Server\MiddlewareInterface接口
原TP6写法class CheckAuth implements \think\Middleware必须改为class CheckAuth implements \Psr\Http\Server\MiddlewareInterface。
第二步:重写handle()方法签名与返回值
旧方法public function handle($request, \Closure $next) → 新方法public function process(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Server\RequestHandlerInterface $handler): \Psr\Http\Message\ResponseInterface;【不改签名会导致中间件被跳过,且无任何错误提示】。
第三步:在process中调用$handler→handle($request)获取响应,而非$next($request)
错误示例:return $next($request) → 正确写法:return $handler->handle($request);因为PSR-15规定处理权必须交还给RequestHandler,由其统一调度后续中间件或最终控制器。
第四步:在app/middleware.php中注册时,传入完整类名字符串,如[\app\middleware\CheckAuth::class],不要用匿名函数或闭包——容器无法对闭包做PSR-15类型校验。
改造请求与响应对象为PSR-7标准
在控制器中停止使用input()、param()、header()等旧方法。
改用注入方式获取标准对象:public function index(\Psr\Http\Message\ServerRequestInterface $request)。
从$request提取数据:
GET参数 → $request->getQueryParams()
POST表单 → $request->getParsedBody()
JSON请求体 → json_decode((string) $request->getBody(), true)
上传文件 → $request->getUploadedFiles()(返回PSR-7 UploadedFileInterface数组)。
构造响应时不再用json()或success()快捷方法。
改用ResponseFactory:$response = \think\facade\Response::create()->withJson(['code' => 0]);,该方法内部已按PSR-7规范设置Content-Type和状态码。
若需自定义响应头,必须用withAddedHeader():$response->withAddedHeader('X-Powered-By', 'TP8');直接调用header()会破坏PSR-7不可变对象原则,导致后续中间件读取不到正确响应头。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











