Как зарегистрировать слушателей событий в Symfony 4? - PullRequest
0 голосов
/ 30 апреля 2018

Я пишу приложение Symfony. Средства. Приложение имеет структуру приложения Symfony и использует Symfony M VC (symfony/http-kernel, symfony/routing и т. Д.), Но оно должно быть как можно более независимым от фреймворка. Поэтому вместо DI фреймворка я использую PHP-DI .

Теперь я добавил компонент symfony/event-dispatcher и зарегистрировал слушателя для всех пользовательских событий.

services.yaml

system.event_handler:
    tags:
        - { name: system.event_handler, event: general.user_message_received, method: handle }
        - { name: system.event_handler, event: xxx.foo, method: handle }
        - { name: system.event_handler, event: yyy.foo, method: handle }
        - { name: system.event_handler, event: zzz.foo, method: handle }

system.event_handler определен в моем файле зависимостей PHP-DI:

...
EventHandlerInterface::class => DI\factory(function(ContainerInterface $container) {
    return new SystemEventHandler(
        $container->get('process_handler.xxx'),
        $container->get('process_handler.yyy'),
        $container->get('process_handler.zzz')
    );
}),
'system.event_handler' => DI\get(EventHandlerInterface::class),
...

Теперь я получаю сообщение об ошибке:

RuntimeException

Определение для "system.event_handler" не имеет класса. Если вы собираетесь чтобы внедрить этот сервис динамически во время выполнения, пометьте его как Синтетический = верно. Если это абстрактное определение, используемое исключительно ребенком определения, пожалуйста, добавьте abstract = true, в противном случае укажите класс для избавиться от этой ошибки.

Почему? Неправильно ли использовать псевдоним в этом темпе?

ОК, я заменил псевдоним в services.yaml на FQCN моего обработчика событий:

App\Process\SystemEventHandler:
    tags:
        - { name: system.event_handler, event: general.user_message_received, method: handle }
        - { name: system.event_handler, event: xxx.foo, method: handle }
        - { name: system.event_handler, event: yyy.foo, method: handle }
        - { name: system.event_handler, event: zzz.foo, method: handle }

Больше ошибок нет. Но обработчик событий по-прежнему не добавляется в EventDispatcher.

Как зарегистрировать прослушиватели событий (определенные в контейнере PHP-DI) в Symfony 4?

1 Ответ

0 голосов
/ 30 апреля 2018

PHP-DI называется запасным вариантом контейнера Symfony. Поэтому, если запись не определена в Symfony, она извлекается из PHP-DI. Однако я никогда не пытался определить запись в обоих контейнерах, из моего POV (как сопровождающего PHP-DI) это не должно работать.

Поскольку вам необходимо использовать теги Symfony, самое простое решение - полностью определить этот конкретный сервис в конфигурации Symfony (не в PHP-DI).

Другим примером может быть попытка написать пропуск компилятора Symfony, чтобы попытаться сделать это, но я не знаю, возможно ли это. Если вам удастся найти хорошее решение, сообщите об этом в хранилище GitHub , мы можем попытаться его интегрировать.

...