我有两个不同的包。
在第一个中,我实现了一个控制台命令。在命令执行期间,我需要启动一个可以被第二个包监听的“事件”,因为我需要执行自定义逻辑。
第一个包必须与第二个包分离(第一个包不能有第二个包的任何引用)。
提前致谢。
答案 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。
希望这有帮助。