Как заставить 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?

0 ответов

Другие вопросы по тегам