TYPO3 12.4.6中接口别名意外表现为单例的问题咨询
TYPO3 接口别名服务意外单例问题分析
这不是系统问题,是你遗漏了DI容器的默认配置细节:
在TYPO3的依赖注入(DI)容器中,所有服务默认都是共享(单例)模式,不管实现类是否继承SingletonInterface。当你为接口配置别名时,这个别名对应的服务定义会沿用默认的shared: true配置,导致每次通过接口获取时都返回同一个实例。
而直接调用GeneralUtility::makeInstance(MyService::class)时,若容器中没有预先注册该类的共享实例,会直接创建新对象,因此不会出现状态保留的问题。
解决方法
在Services.yaml中显式将接口别名或实现类配置为非共享:
方式1:在接口别名配置中添加shared: false
My\Extension\Domain\Interface\MyServiceInterface: alias: My\Extension\Service\MyService public: true shared: false
方式2:在实现类配置中添加shared: false(若实现类有独立配置)
My\Extension\Service\MyService: shared: false My\Extension\Domain\Interface\MyServiceInterface: alias: My\Extension\Service\MyService public: true
配置完成后,每次通过GeneralUtility::makeInstance(MyServiceInterface::class)获取服务时,都会创建新的实例,状态不会被保留。
内容的提问来源于stack exchange,提问作者tiimo
相关产品推荐
相关产品推荐

