Как зарегистрировать слушателей событий в Symfony 4?
Я пишу приложение Symfony. Значит: приложение имеет структуру приложения Symfony и использует M VC Symfony (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" не имеет класса. Если вы намереваетесь внедрить этот сервис динамически во время выполнения, пометьте его как синтетический =true. Если это абстрактное определение используется исключительно дочерними определениями, добавьте 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 ответ
PHP-DI называется запасным вариантом контейнера Symfony. Поэтому, если запись не определена в Symfony, она извлекается из PHP-DI. Однако я никогда не пытался определить запись в обоих контейнерах, из моего POV (как сопровождающего PHP-DI) это не должно работать.
Поскольку вам нужно использовать теги Symfony, самое простое решение - полностью определить этот конкретный сервис в конфигурации Symfony (не в PHP-DI).
Другим примером может быть попытка написать пропуск компилятора Symfony, чтобы попытаться сделать это, но я не знаю, возможно ли это. Если вам удастся найти хорошее решение, сообщите об этом в репозиторий GitHub, мы можем попытаться его интегрировать.