thinkphp 8的容器以psr-11为核心运行骨架,缺任一psr包(共6个)或配置/签名不合规,将导致loggerinterface注入失败、中间件静默跳过、日志无响应等无声故障。

ThinkPHP 8 的容器不是“加了个DI功能”,而是整个运行时骨架被 PSR-11 容器接管;不按 PSR 规范注册服务、注入接口,LoggerInterface、RequestHandlerInterface 这类依赖根本解析失败——不是报错,是直接返回 null 或抛出 EntryNotFoundException。
PSR 包缺失会导致中间件和日志静默失效
TP8 启动时不会主动校验 PSR 依赖是否齐全,但一旦缺包,关键链路就断在底层:
-
psr/log缺失 →LoggerInterface注入失败,think\facade\Log::info()调用无反应,日志文件空,且不报错 -
psr/http-server-middleware缺失 → 中间件类实现Psr\Http\Server\MiddlewareInterface会触发 fatal error,因为接口根本不存在 -
psr/container版本低于 2.0 → 容器无法识别bindIf()或extend()等新方法,app()->bind()失效
执行 composer show | grep psr,必须看到全部 6 个包:psr/log、psr/http-message、psr/container、psr/http-server-middleware、psr/simple-cache、psr/http-factory。少一个,php think optimize:schema 就扫不出对应接口实现。
LoggerInterface 注入失败的三个常见原因
即使 PSR 包齐全,LoggerInterface 仍可能注入失败,根源都在配置与注册环节:
-
config/log.php中'default'值写成'file',但实际注册的驱动名是'single'(TP8 默认驱动名已改),导致容器找不到具体实现 - 没删
runtime/目录就跑php think optimize:schema,旧缓存里的容器绑定关系未刷新,新注册的 logger 实现不生效 - 手动在
app/provider/AppServiceProvider.php中 bind 了LoggerInterface,但没调用$this->app->singleton()或$this->app->bindIf(),只是 new 出实例而未交由容器管理
验证方式:在任意控制器构造函数中声明 private \Psr\Log\LoggerInterface $logger,然后 var_dump($this->logger) —— 若为 null,说明容器未完成绑定。
中间件 process() 方法签名不兼容的典型表现
TP6 的 handle($request, \Closure $next) 在 TP8 中必须改为 PSR-15 标准签名,否则中间件管道直接跳过该中间件,不报错也不执行:
- 旧签名返回值是
Response对象,但 TP8 的管道要求返回Psr\Http\Message\ResponseInterface,类型不匹配则被忽略 - 参数类型未声明为
Psr\Http\Message\ServerRequestInterface和Psr\Http\Server\RequestHandlerInterface,PHP 8+ 严格类型检查下会 fatal - 没在
app/middleware.php中显式启用该中间件,或启用了但顺序靠后,而前置中间件已返回响应,导致后续中间件 never get called
正确写法示例:
public function process(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Server\RequestHandlerInterface $handler): \Psr\Http\Message\ResponseInterface
{
// 你的逻辑
return $handler->handle($request);
}注意结尾必须调用 $handler->handle($request),否则请求链中断。
TP8 的容器化不是“支持 PSR”,而是把 PSR 接口当成运行契约;任何一处松动——比如 config 里写错驱动名、runtime 没清、中间件没重写 process 返回类型——都会让依赖链在某个环节无声断裂,调试时得一层层查 app()->resolved() 和 app()->getBindings() 才能定位到哪一环没注册上。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











