Typo3 11.5表单Finishers执行顺序异常,求调整方法
问题分析
你在表单定义yaml里指定的Finisher顺序是CyberImpactFinisher > EmailToReceiver > FormToDatabase,但实际执行和代码获取到的顺序是EmailToReceiver > CyberImpactFinisher > FormToDatabase,导致调用cancel()只能终止数据库存储,邮件仍会发送。这大概率是自定义Finisher的优先级配置缺失/错误,TYPO3中Finisher的执行顺序会受注册时的priority参数影响,默认优先级为100,数值越小越先执行。如果系统默认的EmailToReceiver优先级比你的自定义Finisher低,就会被提前执行。
调整方法
1. 修改自定义Finisher的注册优先级
找到你注册CyberImpactFinisher的配置文件(通常是EXT:site_pgq/Configuration/Services.yaml),给它设置一个比默认值(100)更小的priority,确保它排在EmailToReceiver前面:
Vendor\SitePgq\Finishers\CyberImpactFinisher: tags: - name: form.finisher identifier: 'CyberImpactFinisher' priority: 50 # 数值越小,执行顺序越靠前
2. 检查表单继承(若有)
如果你的contactUs.form.yaml继承了其他父表单配置,要确保父表单的Finisher没有覆盖当前表单的顺序。可以在当前表单的finishers配置前加上overrideChildProperties: true,强制覆盖父表单的Finisher设置:
finishers: overrideChildProperties: true - options: &cyberImpactFinisherOptions message: 'Merci pour votre message.' templateRootPaths: 100: 'EXT:site_pgq/Resources/Private/Templates/Partial/' templateName: ContactThankYou identifier: CyberImpactFinisher - options: &emailToReceiverOptions # ... 你的EmailToReceiver配置 identifier: EmailToReceiver - identifier: FormToDatabase
3. 验证调整结果
修改后清除TYPO3缓存,然后通过代码$this->finisherContext->getFormRuntime()->getFormDefinition()->getFinishers();再次检查Finisher顺序,确认CyberImpactFinisher排在第一位。之后测试调用$this->finisherContext->cancel();,验证后续的邮件发送和数据库存储是否都被终止。
内容的提问来源于stack exchange,提问作者losted

