必须用 di\bridge\slim\app 包装容器并注册 injectattributes 中间件,否则 slim 4+ 不解析闭包参数;slim 5 尚未适配,需锁定 slim/slim "^4.12"。

composer require php-di/slim-bridge 之后为什么路由里 still can't resolve UserRepository?
不是 PHP-DI 没生效,是 Slim 4+ 根本没把容器交到参数解析器手里。直接 new \Slim\App($container) 是无效的——Slim 4 不再接受裸 Container 实例。
必须用桥接类包装容器:
use DI\Bridge\Slim\App as SlimApp;-
$app = new SlimApp($container);(不是\Slim\App) - 漏掉这层包装,
$app->get('/foo', function (UserRepository $repo) { })中的$repo永远为null
为什么 Slim 4.12 能用但 Slim 5.x 报 ContainerException?
PHP-DI 当前(截至 2026 年中)没有官方适配 Slim 5。装了 slim/slim:^5.0 后,Container::get() 会抛出 ContainerException: no entry or class found,因为生命周期钩子和接口绑定已变更。
正确做法:
- 显式指定 Slim 版本:
composer require slim/slim "^4.12" - 不要依赖
^5.0或*,哪怕 composer.lock 里看起来“能装上” - PHP-DI 官方 issue tracker 明确标注:Slim 5 支持仍在讨论中,暂无 ETA
如何让闭包路由也支持类型提示注入(比如 ServerRequestInterface)?
默认情况下,$app->get('/user', function ($req, $res) { }) 不走 PHP-DI 解析,参数只是空占位符。必须手动挂载中间件才能启用自动注入。
两步到位:
- 加中间件:
$app->add(new \DI\Bridge\Slim\Middleware\InjectAttributes()); - 确保闭包签名用接口类型提示:
function (ServerRequestInterface $request, ResponseInterface $response) - 注意:这个中间件只影响闭包,不影响
[Class::class, 'method']形式——后者天然支持注入
Symfony 项目里用 php-di/symfony-bridge 需要改 AppKernel 吗?
是的,且不能跳过。Symphony 6+ 已弃用 AppKernel,但 php-di/symfony-bridge 当前版本(v7.0.1)仍要求继承自 DI\Bridge\Symfony\Kernel,否则容器构建逻辑不会触发。
关键点:
- 若用 Symfony 6/7,需确认 bridge 版本是否兼容;目前稳定支持止于 Symfony 5.4
-
buildPHPDIContainer()方法里必须调用$builder->addDefinitions(...),否则定义全丢 - 别指望
config/services.php自动被加载——PHP-DI 的配置必须显式传入addDefinitions()
DI\Bridge\Slim\App 这个构造入口,以及 InjectAttributes 中间件对闭包的支持边界。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











