TYPO3弃用#90803问题处理:ObjectManager::get替代使用方案咨询
TYPO3 替换ObjectManager::get获取自定义类实例的方法
推荐方案:构造函数依赖注入(即你提到的Service $service注入方式)
这是TYPO3官方首推的写法,无需手动创建实例,由DI容器自动完成依赖注入:
- 首先确认你的自定义类
HGA\Mairlist\Utilities\SqlSelect可被DI容器识别:
若类没有特殊构造参数,默认无需额外配置。如果需要公开调用或者有自定义依赖,可在你扩展的Configuration/Services.yaml中添加如下配置:services: HGA\Mairlist\Utilities\SqlSelect: public: true # 若类有构造参数需要注入,在此处添加arguments配置即可 # arguments: # $customParam: '@Other\Service\Name' - 在你需要使用SqlSelect的类(如控制器、自定义服务等)中通过构造函数注入:
<?php use HGA\Mairlist\Utilities\SqlSelect; class YourBusinessService { protected SqlSelect $sqlSelect; // 直接声明类型参数,DI容器会自动注入对应实例 public function __construct(SqlSelect $sqlSelect) { $this->sqlSelect = $sqlSelect; } public function yourBusinessMethod() { // 直接调用即可,和原有调用效果完全一致 $setup = $this->sqlSelect->getUid("cr", "lastplay", 3); } }
兼容方案:不支持注入场景的替代写法
如果你的代码场景无法使用构造函数注入(例如静态工具类、未纳入DI管理的老旧代码),可以直接通过GeneralUtility::makeInstance获取实例,完全替代原有ObjectManager中转的逻辑:
<?php // 无需再通过ObjectManager中转,直接获取自定义类实例 $sqlSel = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\HGA\Mairlist\Utilities\SqlSelect::class); $setup = $sqlSel->getUid("cr", "lastplay", 3);
内容的提问来源于stack exchange,提问作者Georgio
相关产品推荐
相关产品推荐

