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

升级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中转获取。具体修改步骤如下:

  1. 在类中声明UriBuilder类型的类属性
  2. 编写构造函数,通过构造函数注入UriBuilder实例
  3. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 02:58:31