#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 обрабатывает только события рабочего процесса. На ощупь это не так чисто, как хотелось бы, но это работает.