升级TYPO3 10后扩展遇参数错误及get方法弃用问题求助
TYPO3 10 扩展升级问题解决方案
问题1解答
是的,必须把new ObjectManager()改成GeneralUtility::makeInstance(ObjectManager::class)。
TYPO3 10开始,ObjectManager的构造函数需要传入特定依赖参数,直接实例化会触发参数数量不匹配的错误。而GeneralUtility::makeInstance是TYPO3官方指定的实例化方式,会通过依赖注入容器自动处理所需参数,确保对象正确初始化。
问题2解答
ObjectManager->get()方法在TYPO3 10中已被弃用,推荐使用**依赖注入(DI)**直接注入所需对象,无需再通过ObjectManager中转获取。具体修改步骤如下:
- 在类中声明
UriBuilder类型的类属性 - 编写构造函数,通过构造函数注入
UriBuilder实例 - 在
rebuildCurrentUri方法中直接使用注入的UriBuilder对象
修改后的完整代码
namespace Something\Somethingelse\Service; use TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder; use TYPO3\CMS\Extbase\Reflection\ObjectAccess; class CanonicalService { /** * @var UriBuilder */ protected $uriBuilder; /** * 通过构造函数注入UriBuilder实例 * * @param UriBuilder $uriBuilder */ public function __construct(UriBuilder $uriBuilder) { $this->uriBuilder = $uriBuilder; } protected function rebuildCurrentUri() { static $uri; if ($uri !== null) { return $uri; } // 直接使用注入的uriBuilder实例,不再依赖ObjectManager if (!is_object(ObjectAccess::getProperty($this->uriBuilder, 'contentObject', true))) { return false; } $uri = $this->uriBuilder->reset() ->setAddQueryString(true) ->setAddQueryStringMethod('GET') ->setCreateAbsoluteUri(true) ->setArgumentsToBeExcludedFromQueryString(['cHash']) ->buildFrontendUri(); return $uri; } }
额外说明
- 依赖注入是TYPO3 8+版本的标准开发规范,能让代码结构更清晰、可测试性更强,同时避免依赖
ObjectManager这类全局服务定位器 - 默认情况下TYPO3会自动识别并处理构造函数注入,无需额外配置
Services.yaml - 原代码中用
ObjectAccess::getProperty获取私有属性的方式不推荐,后续版本若contentObject的访问逻辑变更,可能引发报错,建议优先使用官方提供的公开方法替代
内容的提问来源于stack exchange,提问作者god_is_love
相关产品推荐
相关产品推荐

