2015-02-08 2 views
2

Я создаю некоторые из своих событий, используя 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.

+0

На самом деле услуги должны быть ленивыми, но еще один момент в том, что ctor должны быть дешевыми. Просто сохраните свои параметры ctor для частных атрибутов. Не делайте никаких подключений или проверок, поэтому не имеет значения, загружен ли он ленивым или нет. – Aitch

+0

Да, все службы ленивы загружены, но так же зависят их зависимости, когда они используются. EventDispatcher всегда используется в Symfony, поэтому все слушатели всегда загружаются, включая их зависимости. реализация стратегии «соединить поздно» в каждой службе требует большого количества настраиваемого кода. Загрузка служб, ленивых в этих случаях, дает общее решение для общей проблемы и даже работает для сторонних служб. – DoppyNL

+0

Кроме того, конструкторы не должны быть дешевыми, просто требуйте того, что требуется службой. Услуги должны быть как можно меньше, хотя и, где это возможно, делегировать некоторые задачи другим службам. Если вы сделаете сервис «дешевым», конструктор тоже станет «дешевым». – DoppyNL

ответ

2

Вы можете определить его как Ленивые Services добавление относительной метки (как описано here) в качестве примера:

my.handler: 
    class: Acme\AcmeBundle\DependencyInjection\MyHandler 
    lazy: true 
    arguments: 
     - @my.dependency 
    tags: 
     - { name: kernel.event_listener, event: my.event, method: handle } 

Не забудьте установить ProxyManager мост, как описано в док.

Надеюсь, эта помощь

+1

Работает как описано в связанной документации. ProxyManagerBridge уже установлен в full-stack-symfony, это ocramius/proxy-manager, который вам нужно добавить через композитор. – DoppyNL

+1

Кроме того, может быть лучше (или быстрее) ленить загрузку зависимостей слушателя, а не самого слушателя. Но я не проверял это. При использовании подписчиков (вместо слушателей) вам придется это делать. – DoppyNL

Смежные вопросы