Как использовать EventSubscriber в TYPO3, например, для событий symfony/workflow?

#symfony #typo3 #symfony5 #typo3-10.x

Вопрос:

Как можно использовать SymfonyComponentEventDispatcherEventSubscriberInterface для реализации класса подписчика, прослушивающего события, отправляемые диспетчером событий TYPO3s PSR-14?

Давайте рассмотрим пример использования symfony/workflow расширения TYPO3, которое отлично работает до тех пор, пока дело не дойдет до событий. Из typo3/symfony-psr-event-dispatcher-adapter -за того , что в класс можно плавно добавить Workflow обработчик событий по умолчанию TYPO3. Пока все хорошо.

Теперь у меня есть несколько проблем:

Проблема 1: Имена событий, такие как «рабочий процесс.имя.оставить»

События, отправленные с Workflow использованием строкового имени вместо FQCN, как и все другие события, отправленные в жизненном цикле TYPO3. Это делает невозможным использование обычного способа списков событий , зарегистрированных внутри services.yaml , поскольку для конфигурации требуется FQCN класса событий.

   # this will not work because the "event" needs to be a FQCN
  VendorMyExtEventListenerMyWorkflowEventListener:
    tags:
      - name: event.listener
        identifier: 'vendor-myext/MyWorkflowEventListener'
        event: 'workflow.myname.leave'
        method: 'onLeave'
 

Проблема 2. Попытка использовать средство подписки на события

Документ рекомендует подписчику подписаться на событие. IMO с помощью функции EventSubscriber ( SymfonyComponentEventDispatcherEventSubscriberInterface ) также решит проблему № 1, поскольку конфигурация событий определяется как массив значений ключей внутри getSubscribedEvents() . (Кстати, это, по-видимому, также намного проще для многих событий, как в данном случае событий рабочего процесса, потому что один класс может отвечать за обработку нескольких «похожих» событий и не будет портить services.yaml ).

Также в документе Symfony говорится, что реализации этого интерфейса, пока autowire и autoconfigure настроено true , будет достаточно; подписчик событий должен быть доступен и прослушиваться. Возможно, это верно в простой среде Symfony, но, похоже, не в контексте TYPO3. К сожалению, я не могу понять, почему (классы подписчиков не отображаются в массиве EventDispatcher->ListenerProvider->>listeners).

Как продолжить здесь?

Ответ №1:

Диспетчер событий ядра TYPO3 не может обрабатывать или регистрировать Подписчиков (пока). Так что на данный момент я закончил тем, что использовал SymfonyComponentEventDispatcherEventDispatcher параллельно с опечаткой 3 по умолчанию. В этом случае Symfony EventDispatcher обрабатывает только события рабочего процесса. На ощупь это не так чисто, как хотелось бы, но это работает.