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

TYPO3 12+及13版本:如何用新TypoScript解析器重构旧代码

TYPO3 13 旧TypoScript解析器代码重构方案

核心替代组件

在TYPO3 13中,需弃用旧的TypoScriptParser和TSFE->tmpl,改用以下官方推荐的组件:

  • \TYPO3\CMS\Core\TypoScript\Tokenizer\Tokenizer:负责TypoScript字符串的分词处理
  • \TYPO3\CMS\Core\TypoScript\Parser\Parser:对分词结果进行解析,生成配置数组
  • \TYPO3\CMS\Core\TypoScript\FrontendTypoScript:用于获取和管理前端全局TypoScript配置
  • \TYPO3\CMS\Core\TypoScript\TypoScriptService:提供TypoScript路径值的查询能力

重构后的代码示例

假设你的Hook类采用依赖注入方式实现(TYPO3 11+推荐的做法):

use TYPO3\CMS\Core\TypoScript\FrontendTypoScript;
use TYPO3\CMS\Core\TypoScript\TypoScriptService;
use TYPO3\CMS\Core\TypoScript\Tokenizer\Tokenizer;
use TYPO3\CMS\Core\TypoScript\Parser\Parser;

class YourContentObjectPostInitHook
{
    public function __construct(
        protected readonly FrontendTypoScript $frontendTypoScript,
        protected readonly TypoScriptService $typoScriptService,
        protected readonly Tokenizer $tokenizer,
        protected readonly Parser $parser
    ) {}

    public function execute(array $configuration): void
    {
        // 1. 解析自定义TypoScript字符串
        $tokenStream = $this->tokenizer->tokenize($configuration['TypoScript']);
        $parsedTypoScript = $this->parser->parse($tokenStream)->getSetupArray();

        // 2. 获取当前全局TypoScript配置
        $currentSetup = $this->frontendTypoScript->getSetup();

        // 3. 将解析后的配置合并到lib.menux节点
        $currentSetup['lib.']['menux'] = array_merge(
            $currentSetup['lib.']['menux'] ?? [],
            $parsedTypoScript
        );

        // 4. 更新全局TypoScript配置
        $this->frontendTypoScript->setSetup($currentSetup);

        // 5. 获取指定路径的配置值
        $setup = $this->typoScriptService->getTypoScriptPathValue(
            $configuration['TypoScriptObjPath'],
            $currentSetup
        );
    }
}

关键变化说明

  • 移除全局变量依赖:不再使用$GLOBALS['TSFE'],通过依赖注入获取官方服务,符合TYPO3现代开发规范
  • 拆分解析流程:旧的TypoScriptParser被拆分为Tokenizer和Parser,职责更清晰
  • 配置管理标准化:通过FrontendTypoScript统一管理全局TypoScript配置,替代弃用的tmpl属性
  • 路径查询优化:使用TypoScriptService::getTypoScriptPathValue替代旧的getVal方法,兼容性更强

内容的提问来源于stack exchange,提问作者John Miller

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:22:48