如何在 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 文档还说,在 autowireautoconfigure 设置为 true 时实现这个接口就足够了; EventSubscriber 应该可用并正在收听。也许这在一个普通的 Symfony 环境中是正确的,但它似乎不是在 TYPO3 的上下文中。不幸的是,我不知道为什么(订阅者类没有出现在 EventDispatcher->ListenerProvider->listeners 数组中)。

这里如何继续?

【问题讨论】:

【参考方案1】:

TYPO3 核心 EventDispatcher 无法处理或注册订阅者(目前)。所以现在我最终将Symfony\Component\EventDispatcher\EventDispatcher 与 TYPO3 默认值并行使用。 Symfony EventDispatcher 在这种情况下只处理工作流事件。感觉不像我想的那么干净,但它确实有效。

【讨论】:

以上是关于如何在 TYPO3 中使用 EventSubscriber,例如对于 symfony/工作流事件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 TYPO3 中间件时如何添加 cookie?

如何在 TYPO3 v9 URL 中添加斜杠?

如何在typo3 V10的extbase控制器中重定向到404页面

如何在 Typo3 版本 10 ($GLOBALS['TYPO3_DB']->sql_query()) 中执行普通 SQL?

如何在 TYPO3 中压缩我的 js/css 文件

如何将当前页面标题自动插入到 TYPO3 模板中?