Symfony2:如何挂钩从不同bundle的控制台命令启动的事件

时间:2014-06-01 12:31:12

标签: symfony command dispatcher event-listener symfony-2.4

我有两个不同的包。

在第一个中,我实现了一个控制台命令。在命令执行期间,我需要启动一个可以被第二个包监听的“事件”,因为我需要执行自定义逻辑。

第一个包必须与第二个包分离(第一个包不能有第二个包的任何引用)。

提前致谢。

2 个答案:

答案 0 :(得分:3)

在第一个捆绑命令中调度一个事件

<?php

namespace FirstBundle\Command;

class SomeCommand extends ContainerAwareCommand
{
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        // ...
        $this->getContainer()->get('event_dispatcher')->dispatch(
            'my.event'
            new GenericEvent($someData)
        );
        // ...
    }
}

来自第二个包的侦听器,带有catch

<?php

namespace SecondBundle\Listener;

class MyEventListener
{
    public functon onMyEvent(GenericEvent $event)
    {
        $data = $event->getSubject();
        // do something
    }
}

因为他在服务声明中订阅了该事件

# SecondBundle/Resources/config/services.yml
services:
    second.my_event_listener:
        class: SecondBundle\Listener\MyEventListener
        tags:
            - { name: kernel.event_listener, event: my.event, method: onMyEvent }

答案 1 :(得分:0)

在第一个包中,照常在命令中调度事件。分派事件时,还会提供唯一的名称以及分派的事件。

在第二个包中,创建一个监听器(class和yml / xml config),它将使用该唯一名称监听事件。

这样,第一个包就不会知道第二个包了。如果第二个包不存在,则没有侦听器会捕获该事件。

现在唯一的问题是事件本身。我建议你看一下GenericEvent。

http://symfony.com/doc/current/components/event_dispatcher/generic_event.html

此外,尽量不要传入第一个包中定义的任何对象,否则您将使第二个包依赖于第一个包。我会传递简单数据,例如int,string,array。

希望这有帮助。

相关问题