TYPO3 11.5.28表单完成器API调用后抛出错误/消息的方法
在TYPO3 11自定义表单完成器中实现前端Flash消息提示
问题原因
你遇到的Call to a member function get() on null错误,通常是因为未正确获取当前请求对象(Request),或是没有通过依赖注入的方式获取Flash消息相关服务,直接使用全局变量导致上下文为空。
正确实现步骤
1. 自定义完成器类的依赖注入与消息添加逻辑
在你的自定义完成器类中,通过依赖注入注入FlashMessageService和RequestStack,这是TYPO3 11推荐的服务获取方式,避免全局变量的上下文问题:
use TYPO3\CMS\Core\Messaging\FlashMessage; use TYPO3\CMS\Core\Messaging\FlashMessageService; use TYPO3\CMS\Core\Http\RequestStack; use TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher; class YourCustomFinisher extends AbstractFinisher { protected FlashMessageService $flashMessageService; protected RequestStack $requestStack; // 通过构造函数注入依赖 public function __construct(FlashMessageService $flashMessageService, RequestStack $requestStack) { $this->flashMessageService = $flashMessageService; $this->requestStack = $requestStack; } protected function executeInternal() { // 执行你的API调用逻辑 $apiResponse = $this->sendDataToApi(); // 处理API错误反馈 if ($apiResponse['errorCode'] !== 0) { // 创建错误类型的Flash消息 $errorMessage = new FlashMessage( sprintf('提交失败:%s', $apiResponse['errorMsg']), '表单提交错误', FlashMessage::ERROR, false ); // 获取当前请求并添加消息到队列 $currentRequest = $this->requestStack->getCurrentRequest(); if ($currentRequest !== null) { $messageQueue = $this->flashMessageService->getMessageQueueByIdentifier(); $messageQueue->addMessage($errorMessage, $currentRequest); } // 若需要终止后续完成器执行,可抛出异常 // throw new \TYPO3\CMS\Form\Domain\Finishers\Exception\FinisherException('API调用失败', 1700000000); } } private function sendDataToApi(): array { // 你的API调用实现,返回包含错误码的响应数组 return ['errorCode' => 1, 'errorMsg' => '参数格式不正确']; } }
2. 配置依赖注入(Services.yaml)
在你的扩展Configuration/Services.yaml中注册完成器,确保依赖能正确注入:
services: Vendor\YourExtension\Domain\Finishers\YourCustomFinisher: arguments: $flashMessageService: '@TYPO3\CMS\Core\Messaging\FlashMessageService' $requestStack: '@TYPO3\CMS\Core\Http\RequestStack' tags: - name: form.finisher identifier: 'YourCustomFinisher'
3. 前端模板渲染Flash消息
在表单所在的Fluid模板中添加Flash消息渲染标签,确保错误能在前端显示:
<!-- 在表单页面或结果页面的合适位置添加 --> <f:flashMessages />
关键注意事项
- 必须通过
RequestStack获取当前请求,而非直接使用$GLOBALS['TYPO3_REQUEST'],后者在某些上下文(如后台异步执行)中可能为空。 - 添加消息前务必判断
$currentRequest不为null,避免触发空指针错误。 - 如果需要阻止后续完成器执行,可抛出
FinisherException,同时Flash消息依然会生效。
内容的提问来源于stack exchange,提问作者Urs Bo
相关产品推荐
相关产品推荐

