如何在Symfony DI中通过container->get()实现服务自动注入?
解决Symfony DI组件自动注入依赖失败的问题
针对你遇到的Denormalizer构造函数依赖未自动注入的问题,按以下步骤排查和解决:
1. 确认容器构建时已执行编译操作
Symfony DI组件的自动注入逻辑是在容器编译阶段完成依赖解析的,如果跳过编译步骤,容器只会直接实例化类而不会处理依赖注入。确保你的容器构建代码包含编译操作:
use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; // 实例化容器构建器 $containerBuilder = new ContainerBuilder(); // 加载services.yaml配置 $loader = new YamlFileLoader($containerBuilder, new FileLocator(__DIR__)); $loader->load('services.yaml'); // 关键:执行容器编译,这一步会处理自动注入的依赖解析 $containerBuilder->compile(); // 现在获取服务就能自动注入依赖了 $denormalizer = $containerBuilder->get(Denormalizer::class);
2. 检查services.yaml配置的正确性
确保你的配置正确开启了自动注入,并覆盖了FileToObject命名空间下的所有类:
services: # 全局默认配置 _defaults: autowire: true # 开启自动注入 autoconfigure: true # 自动配置(处理服务标签等逻辑) public: false # 默认服务不公开,仅按需公开 # 注册FileToObject命名空间下的所有服务 FileToObject\: resource: './src/' # 指向你的源码目录,根据项目结构调整路径 public: true # 公开该命名空间下的所有服务,方便直接get获取
注意:resource路径要与你的项目结构匹配,路径错误会导致服务无法被注册。
3. 验证ReflectionCache类的可注入性
确保ReflectionCache满足自动注入的前提条件:
- 不是抽象类或接口(如果是接口,需要在配置中绑定对应的实现类)
- 拥有公开的构造函数,且构造函数的依赖都是可被DI容器自动解析的类类型(非类类型参数如字符串、数组需要手动在配置中指定)
ReflectionCache类确实在FileToObject命名空间下,且被包含在services.yaml的resource路径覆盖范围内
4. 排查依赖链的完整性
如果ReflectionCache自身还有构造函数依赖,也要确保这些依赖同样满足自动注入条件,否则会导致Denormalizer的依赖注入失败。比如如果ReflectionCache依赖另一个类XXX,那XXX也需要被DI容器识别为服务,且能自动注入。
内容的提问来源于stack exchange,提问作者Lord Bo
相关产品推荐
相关产品推荐

