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
相关产品推荐
相关产品推荐

