Я создаю некоторые из своих событий, используя Symfony Event Dispatcher, который отлично работает.диспетчер событий symfony2 lazy загрузчик прослушивания
Я заметил, однако, что слушатель, сконфигурированный в symfony, не ленивый, он всегда инициализируется. Однако он редко используется.
Конфигурационный в моем services.yml выглядит следующим образом:
my.handler:
class: Acme\AcmeBundle\DependencyInjection\MyHandler
arguments:
- @my.dependency
tags:
- { name: kernel.event_listener, event: my.event, method: handle }
Есть ли способ настроить это таким образом, что @ my.handler только инициализируется, когда событие срабатывает? Поскольку теперь он инициализируется (вместе со всеми его зависимостями), когда он помещается в диспетчер.
Существует документация о ContainerAwareEventDispatcher: http://symfony.com/doc/current/components/event_dispatcher/container_aware_dispatcher.html Но это только объясняет, как использовать его непосредственно в PHP, а не как настроить его в стандартном проекте Symfony2.
На самом деле услуги должны быть ленивыми, но еще один момент в том, что ctor должны быть дешевыми. Просто сохраните свои параметры ctor для частных атрибутов. Не делайте никаких подключений или проверок, поэтому не имеет значения, загружен ли он ленивым или нет. – Aitch
Да, все службы ленивы загружены, но так же зависят их зависимости, когда они используются. EventDispatcher всегда используется в Symfony, поэтому все слушатели всегда загружаются, включая их зависимости. реализация стратегии «соединить поздно» в каждой службе требует большого количества настраиваемого кода. Загрузка служб, ленивых в этих случаях, дает общее решение для общей проблемы и даже работает для сторонних служб. – DoppyNL
Кроме того, конструкторы не должны быть дешевыми, просто требуйте того, что требуется службой. Услуги должны быть как можно меньше, хотя и, где это возможно, делегировать некоторые задачи другим службам. Если вы сделаете сервис «дешевым», конструктор тоже станет «дешевым». – DoppyNL