Как заставить WildcardEventDispatcher работать в приложении Symfony 4?
В приложении Symfony 4, которое я пишу, мне нужно объединить несколько Event
и обрабатывать их одним и тем же обработчиком событий.
В настоящее время код выглядит так:
services.yaml
# events
App\Process\MyEventHandler:
class: 'App\Process\MyEventHandler'
tags:
- { name: kernel.event_listener, event: foo:event_a, method: dispatch }
- { name: kernel.event_listener, event: foo:event_b, method: dispatch }
- { name: kernel.event_listener, event: bar:event_c, method: dispatch }
- { name: kernel.event_listener, event: bar.baz:event_d, method: dispatch }
- { name: kernel.event_listener, event: bar.baz.buz:event_e, method: dispatch }
MyController
class MyController extends Controller
{
public function __construct(EventDispatcherInterface $eventDispatcher)
{
$this->eventDispatcher = $eventDispatcher;
}
public function processUserMessageAction(Request $request)
{
...
$message = $request->get('message');
$this->eventDispatcher->dispatch('general:user_message_received', new GenericEvent($message));
return new Response();
}
}
MyEventHandler#dispatch(...)
работает как фасад / прокси / концентратор: он получает начальное событие, находит соответствующий конкретный обработчик для него и отправляет его этому обработчику.
Сейчас есть много разных событий, и больше не удобно хранить их в длинном списке тегов в services.yaml
, Я хочу использовать подстановочные знаки в именах событий, например:
Теги App\Process\MyEventHandler: class: 'App\Process\MyEventHandler': - {имя: kernel.event_listener, событие: foo:*, метод: отправка}
Есть библиотека, которая, кажется, реализует эту функциональность - WildcardEventDispatcher
(jmikola/WildcardEventDispatcher
).
Я установил его, заменил Controller
"s EventDispatcher
зависимость от WildcardEventDispatcher
, добавил WildcardEventDispatcher
как услуга для services.yaml
и заменил соответствующие места в именах моих событий в services.yaml
звездочками и хешами:
services.yaml
# events
App\Process\MyEventHandler:
class: 'App\Process\MyEventHandler'
tags:
- { name: kernel.event_listener, event: foo:*, method: dispatch }
- { name: kernel.event_listener, event: bar.#, method: dispatch }
Но это не работает. EventDispatcher
кажется, интерпретирует имена событий напрямую, без сопоставления с регулярным выражением. Итак MyEventHandler#dispatch(...)
больше не выполняется.
Как получить WildcardEventDispatcher
работать как положено и использовать подстановочные знаки в именах событий в приложении Symfony 4?