Я пишу приложение 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?