TYPO3中能否定义同时处理运行时参数与依赖注入的构造函数?
构造函数同时处理运行时参数与依赖注入的解决方案
你遇到的报错原因是:依赖注入容器无法自动解析array这类通用原生类型的参数——容器只能自动识别并注入有明确绑定的对象类(比如NewsRepository),而像数组、字符串这种没有唯一对应服务的类型,容器不知道该填充什么值,所以会提示你显式配置。
下面是几种可行的解决方式:
方式一:拆分参数,用Setter方法传递运行时参数
把构造函数只留给依赖注入的对象,运行时参数通过单独的Setter方法传入:
class MyClass { protected array $runtimeArg; // 构造函数仅处理依赖注入的对象 public function __construct( private readonly NewsRepository $newsRepository ) {} // 添加Setter方法传递运行时参数 public function setRuntimeArg(array $runtimeArg): void { $this->runtimeArg = $runtimeArg; } } // 先创建实例(容器自动注入NewsRepository),再设置运行时参数 $myClass = GeneralUtility::makeInstance(MyClass::class); $myClass->setRuntimeArg([]);
方式二:使用工厂类封装实例创建
写一个专门的工厂类,让容器注入NewsRepository,再通过工厂方法接收运行时参数并创建MyClass实例:
class MyClassFactory { public function __construct( private readonly NewsRepository $newsRepository ) {} public function create(array $runtimeArg): MyClass { return new MyClass($runtimeArg, $this->newsRepository); } } // 先获取工厂实例(容器自动注入NewsRepository),再创建MyClass $factory = GeneralUtility::makeInstance(MyClassFactory::class); $myClass = $factory->create([]);
方式三:显式传递所有构造函数参数
如果依赖不多,也可以手动获取依赖对象,然后和运行时参数一起传给makeInstance:
// 先从容器获取NewsRepository实例 $newsRepository = GeneralUtility::makeInstance(NewsRepository::class); // 显式传递所有构造函数参数 $myClass = GeneralUtility::makeInstance(MyClass::class, [], $newsRepository);
内容的提问来源于stack exchange,提问作者mhirdes
相关产品推荐
相关产品推荐

