You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:05:56