Symfony 7按环境注入同接口不同服务:when@dev配置失效
问题分析与解决方案
你的配置问题在于主services块已经默认将ExampleAdapterInterface绑定到Mock适配器,导致when@dev里的重复配置完全冗余,不会产生任何实际效果。
修正后的配置(按常见需求)
如果你的预期是:
- dev环境使用Mock适配器
- prod/qas环境使用真实适配器
调整配置如下:
services: App\Mocks\Adapter\ExampleAdapterMock: ~ App\Adapter\ExampleAdapter: ~ # 默认绑定真实适配器(prod/qas环境继承此配置) App\Adapter\ExampleAdapterInterface: '@App\Adapter\ExampleAdapter' when@dev: services: # 覆盖为Mock适配器 App\Adapter\ExampleAdapterInterface: '@App\Mocks\Adapter\ExampleAdapterMock' when@prod: &prod_adapter services: # 可省略,默认已绑定真实适配器,保留也不影响 App\Adapter\ExampleAdapterInterface: '@App\Adapter\ExampleAdapter' when@qas: *prod_adapter
若当前配置逻辑符合你的需求(主配置用Mock,dev保持Mock)
如果你的预期就是默认用Mock,仅prod/qas切换到真实适配器,但配置未生效,排查以下几点:
- 验证当前环境:执行
php bin/console debug:container --env=dev App\Adapter\ExampleAdapterInterface,查看实际绑定的服务 - 清理缓存:dev环境虽默认不缓存,但手动缓存过的话执行
php bin/console cache:clear --env=dev - 检查其他配置文件:确认
config/packages/dev/services.yaml等文件没有重新绑定该接口
内容的提问来源于stack exchange,提问作者Shudhansh Shekhar
相关产品推荐
相关产品推荐

