【发布时间】: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 数组中)。
这里如何继续?
【问题讨论】:
标签: symfony typo3 symfony5 typo3-10.x