如何在TYPO3的AbstractPageTitleProvider子类中访问请求对象与frontend.page.information
在TYPO3 v13中继承AbstractPageTitleProvider访问Request对象的正确方式
问题根源
AbstractPageTitleProvider实现了RequestAwareInterface,其内部的$request属性为只读(readonly),由TYPO3在请求生命周期中自动注入,不能手动赋值或修改。直接在类的构造函数、属性初始化阶段访问$request会触发"未初始化"错误,因为注入动作晚于这些阶段。
正确实现步骤
1. 正确注册PageTitleProvider
确保你的类在Configuration/Services.yaml中完成注册,让TYPO3能识别并自动处理依赖注入:
services: MyVendor\MySitepackage\PageTitle\MyOwnPageTitleProvider: tags: - name: page.title.provider identifier: 'my-own-page-title-provider' priority: 50 # 数值越高,该Provider的优先级越高,可按需调整
2. 在合适的方法中访问Request与页面信息
不要在构造函数或属性声明阶段访问$request,而是在实际生成标题的业务方法(如getTitle())中使用。示例代码修改如下:
<?php declare(strict_types=1); namespace MyVendor\MySitepackage\PageTitle; use TYPO3\CMS\Core\PageTitle\AbstractPageTitleProvider; final class MyOwnPageTitleProvider extends AbstractPageTitleProvider { public function getTitle(): string { // 先判断Request是否已被注入 if (!$this->request) { return parent::getTitle(); } // 获取frontend.page.information属性 $pageInformation = $this->request->getAttribute('frontend.page.information'); if (!$pageInformation) { return parent::getTitle(); } // 替代原$GLOBALS['TSFE']->page,获取当前页面数据 $currentPage = $pageInformation->getPage(); // 替代原$GLOBALS['TSFE']->rootLine,获取根线路径 $rootLine = $pageInformation->getRootLine(); // 自定义标题逻辑示例 $customTitle = $currentPage['title'] . ' - ' . $rootLine[0]['title']; $this->title = $customTitle; return $this->title; } }
3. 解决"只读属性"报错
官方示例中如果尝试手动赋值$request(比如构造函数注入后直接赋值)会触发错误,因为$request是readonly属性。无需手动处理注入,TYPO3会通过RequestAware机制自动完成$request的设置。
关键说明
$request会在PageTitleProvider被调用前由TYPO3容器自动注入,只需在使用前判断是否存在即可。frontend.page.information提供的getPage()和getRootLine()方法,完全替代了原$GLOBALS['TSFE']中的对应属性。- 优先级配置决定了多个PageTitleProvider的执行顺序,可根据业务需求调整数值。
内容的提问来源于stack exchange,提问作者clive beckett
相关产品推荐
相关产品推荐

