TYPO3仅当其他扩展加载时注入repository出现类不存在错误如何解决
问题原因
- 类名拼写错误:你在注入方法的参数列表中将类名误写为
PublicationRepositorysitory,比正确的类名PublicationRepository多了冗余的sitory后缀,就算目标扩展已安装,拼写错误也会直接触发类不存在的错误。 - 注入逻辑不符合TYPO3 DI机制的运行规则:TYPO3的依赖注入反射扫描发生在编译阶段,会提前解析注入方法的参数类型,无论你方法内部是否加了扩展加载判断,只要你在参数类型提示中引用了未安装扩展的类,反射阶段就会因为找不到对应类抛出异常。
解决方案
第一步:修正类名拼写错误
先将注入方法参数中的错误类名修正为正确的\Vendor\ExtensionName\Domain\Repository\PublicationRepository,解决拼写导致的直接报错。
第二步:重构条件注入逻辑
原有直接在注入方法加类型提示的方式无法满足可选扩展的依赖注入需求,可选择以下两种方案实现需求:
方案1:按需手动获取实例(兼容性最好)
删除原有注入方法,在实际需要调用该仓库的业务逻辑位置,先判断扩展是否加载,再手动获取实例:
// 业务逻辑中需要用到PublicationRepository的位置 if (\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::isLoaded('extension_name')) { // TYPO3 10.x及以下可用ObjectManager $publicationRepository = $this->objectManager->get(\Vendor\ExtensionName\Domain\Repository\PublicationRepository::class); // TYPO3 11.x及以上可直接用通用实例方法获取 // $publicationRepository = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\Vendor\ExtensionName\Domain\Repository\PublicationRepository::class); // 后续调用仓库的业务逻辑 }
方案2:通过服务配置加条件注入(适合TYPO3 10.x及以上版本)
在你自己扩展的Configuration/Services.yaml中为该依赖添加加载条件,仅当目标扩展存在时才注入:
services: # 替换为你自己的类的完整命名空间 Vendor\YourExtension\Controller\YourController: properties: # 对应类中提前声明的$publicationRepository属性 $publicationRepository: '@Vendor\ExtensionName\Domain\Repository\PublicationRepository' # 仅当目标扩展已加载时才执行注入 if: 'TYPO3\CMS\Core\Utility\ExtensionManagementUtility::isLoaded("extension_name")'
使用该方案仅需要在类中提前声明protected $publicationRepository;属性即可,无需再编写单独的注入方法。
内容的提问来源于stack exchange,提问作者Heinz Schilling
相关产品推荐
相关产品推荐

