如何在 TYPO3 中使用 EventSubscriber,例如对于 symfony/工作流事件?
Posted
技术标签:
【中文标题】如何在 TYPO3 中使用 EventSubscriber,例如对于 symfony/工作流事件?【英文标题】:How to use EventSubscriber in TYPO3 e.g. for symfony/workflow events? 【发布时间】:2021-11-16 13:50:11 【问题描述】:如何使用Symfony\Component\EventDispatcher\EventSubscriberInterface
实现订阅者类,监听由 TYPO3s PSR-14 EventDispatcher 调度的事件?
让我们看一个示例,使用symfony/workflow
进行 TYPO3 扩展,它在涉及事件之前非常有效。因为typo3/symfony-psr-event-dispatcher-adapter
,TYPO3默认的EventDispatcher可以顺利加入Workflow
类。到目前为止一切顺利。
现在我有几个问题:
问题 1:'workflow.myname.leave' 等事件名称
Workflow
使用字符串名称调度的事件,而不是像 TYPO3 生命周期中调度的所有其他事件那样使用 FQCN。这使得无法使用services.yaml
内部注册的EventListener的常用方式,因为配置需要事件类的FQCN。
# this will not work because the "event" needs to be a FQCN
Vendor\MyExt\EventListener\MyWorkflowEventListener:
tags:
- name: event.listener
identifier: 'vendor-myext/MyWorkflowEventListener'
event: 'workflow.myname.leave'
method: 'onLeave'
问题 2:尝试使用 EventSubscriber
doc recomments an EventSubscriber。 IMO 使用 EventSubscriber (Symfony\Component\EventDispatcher\EventSubscriberInterface
) 也可以解决问题 #1,因为事件的配置被定义为 getSubscribedEvents()
内的键值数组。 (顺便说一句,对于像这种工作流事件这样的许多事件来说,这似乎也容易得多,因为一个类可以负责处理多个“相似”事件,并且不会弄乱services.yaml
)。
Symfony 文档还说,在 autowire
和 autoconfigure
设置为 true
时实现这个接口就足够了; EventSubscriber 应该可用并正在收听。也许这在一个普通的 Symfony 环境中是正确的,但它似乎不是在 TYPO3 的上下文中。不幸的是,我不知道为什么(订阅者类没有出现在 EventDispatcher->ListenerProvider->listeners 数组中)。
这里如何继续?
【问题讨论】:
【参考方案1】:TYPO3 核心 EventDispatcher 无法处理或注册订阅者(目前)。所以现在我最终将Symfony\Component\EventDispatcher\EventDispatcher
与 TYPO3 默认值并行使用。 Symfony EventDispatcher 在这种情况下只处理工作流事件。感觉不像我想的那么干净,但它确实有效。
【讨论】:
以上是关于如何在 TYPO3 中使用 EventSubscriber,例如对于 symfony/工作流事件?的主要内容,如果未能解决你的问题,请参考以下文章
如何在typo3 V10的extbase控制器中重定向到404页面
如何在 Typo3 版本 10 ($GLOBALS['TYPO3_DB']->sql_query()) 中执行普通 SQL?