Прослушиватель не вызывается в консольной команде

Мне нужно было сохранять дополнительные объекты, когда другие объекты сохраняются или обновляются. Поэтому я создал решение, вдохновленное этим сообщением: https://stackoverflow.com/a/11054101/1526162.

config.yml:

services:
    transaktion.chain:
        class: Foo\BarBundle\Listener\Chain

    transaktion.flush:
        class: Foo\BarBundle\Listener\Flush
        arguments: [ @doctrine.orm.entity_manager, @transaktion.chain ]
        tags:
            - { name: kernel.event_listener, event: kernel.response, method: onResponse, priority: 5 }

    transaktion.listener:
        class: Foo\BarBundle\Listener\TransaktionLogger
        arguments: [ @transaktion.chain ]
        tags:
            - { name: doctrine.event_listener, event: postPersist }
            - { name: doctrine.event_listener, event: postUpdate }
            - { name: doctrine.event_listener, event: preRemove }

События postPersist, postUpdate и preRemove добавляют информацию в цепочку, а в конце kernel.response запускает Flush и создаются необходимые дополнительные сущности. Все работает нормально.

Но когда я сохраняю сущности внутри консольной команды, это не работает. Я думаю, что нет события kernel.response. Есть ли другое полезное событие, которое работает с контроллерами и консольными командами?

Дополнительная информация: я использую Symfony 2.3.


person Stefan Bergfeld    schedule 01.11.2013    source источник


Ответы (1)


Консольные события были добавлены в Symfony 2.3.

Краткое введение можно найти в этом блоге. сообщение.

Вы можете найти имена событий консоли в классе Symfony. \Component\Console\ConsoleEvents.

const ConsoleEvents::COMMAND = 'console.command';
const ConsoleEvents::TERMINATE = 'console.terminate';
const ConsoleEvents::EXCEPTION = 'console.exception';

Просто добавьте тег console.terminate к своему подписчику, и все будет в порядке.

tags:
    - { name: kernel.event_listener, event: kernel.response, method: onResponse }  
    - { name: kernel.event_listener, event: console.terminate, method: onResponse }
person Nicolai Fröhlich    schedule 02.11.2013
comment
Я уже работал над этим, но мне не удалось найти правильное имя события для записи тегов. Кстати: есть ли в документации список всех доступных событий? - person Stefan Bergfeld; 02.11.2013