Symfony5.4+PHP8.1环境下如何为抽象类注入环境变量?
问题分析与解决方案
错误根源
AbstractClassThree 的构造函数声明了必填的 $injectedVar 参数,但 AbstractClassTwo 的构造函数调用父类构造时,没有传递任何参数:parent::__construct();。Symfony 的自动装配和参数绑定仅作用于容器实例化类时的构造函数参数注入,无法干预子类手动调用父类构造的过程,因此触发 PHP 参数不足的错误。
修复方案
修改 AbstractClassTwo 的构造函数,接收 $injectedVar 参数并传递给父类构造,让 Symfony 自动注入绑定的环境变量值:
abstract class AbstractClassTwo extends AbstractClassThree { // 新增 $injectedVar 参数,依赖 Symfony 自动注入 public function __construct(protected string $injectedVar, array $arr = []){ parent::__construct($injectedVar); // 传递参数给父类构造 $this->arr = $arr; } }
原理说明
当 Symfony 容器实例化具体类 One 时,会解析其继承链的构造函数依赖:
- 识别到
AbstractClassTwo的构造函数需要string $injectedVar参数; - 根据
services.yaml中的bind配置,自动将%env(TO_INJECT)%的值注入该参数; AbstractClassTwo再将参数传递给AbstractClassThree的构造函数,满足父类的参数要求。
如果 AbstractClassTwo 不需要直接使用 $injectedVar,也可以将参数设为私有,仅用于传递给父类:
abstract class AbstractClassTwo extends AbstractClassThree { public function __construct(private string $injectedVar, array $arr = []){ parent::__construct($injectedVar); $this->arr = $arr; } }
内容的提问来源于stack exchange,提问作者Oceanic_Panda
相关产品推荐
相关产品推荐

