如何为两个实现同一接口的Symfony服务自动注入并添加环境变量
解决Symfony <6版本下给ListService注入APP_ENV的正确配置方式
步骤1:更新ListService的构造函数
首先在ListService的构造函数中添加接收环境变量的参数:
// src/Service/ListService.php namespace App\Service; class ListService implements ListServiceInterface { private $sapListService; private $environment; // 构造函数新增$env参数,类型声明为string public function __construct(SapListService $sapListService, string $env) { $this->sapListService = $sapListService; $this->environment = $env; } // 后续可通过$this->environment获取APP_ENV的值 }
步骤2:修改services.yaml配置(两种可选方式)
方式一:单独给ListService配置参数
直接在ListService的服务定义中,通过arguments注入环境变量,注意参数名要和构造函数中的变量名完全匹配(此处为$env):
# config/services.yaml services: # 接口别名配置保持不变 App\Service\ListServiceInterface: alias: App\Service\ListService App\Service\ListService: arguments: $sapListService: '@App\Service\SapListService' # 用%env(APP_ENV)%格式引用环境变量 $env: '%env(APP_ENV)%' App\Service\SapListService: ~
方式二:全局绑定参数(推荐,适用于多服务需注入环境变量的场景)
如果你的Symfony启用了默认自动配置(_defaults中autowire: true),可以全局绑定$env参数到APP_ENV,所有构造函数包含$env参数的服务都会自动注入:
# config/services.yaml services: _defaults: autowire: true autoconfigure: true public: false # 全局绑定$env参数 bind: $env: '%env(APP_ENV)%' # 服务定义无需额外配置arguments App\Service\ListServiceInterface: alias: App\Service\ListService App\Service\ListService: ~ App\Service\SapListService: ~
避免YAML格式错误的注意事项
- 缩进必须用2个空格(禁止用Tab),保证层级结构正确;
- 环境变量必须用
%env(变量名)%格式包裹,不能直接写APP_ENV; - 构造函数参数名要和yaml中
arguments下的键名完全一致(包括$符号)。
内容的提问来源于stack exchange,提问作者Calamity Jane
相关产品推荐
相关产品推荐

