来自Symfony2的EventDispatcher组件文档:
Symfony2的EventDispatcher组件以简单有效的方式实现了中介者模式,使所有这些事情成为可能,并使您的项目真正具有可扩展性。
我一直在阅读Event Aggregator和Mediator模式及其differences。对我来说,Event Aggregator看起来是中介者的一个特定案例,它使用事件来促进通信,并且内部没有任何业务逻辑。另一方面,中介者更加通用,可以允许一些业务逻辑决定是否应该进行某些通信。
因此,我检查了Symfony2的EventDispatcher或TraceableEventDispatcher的源代码,并发现唯一可能改变通信的逻辑是检查事件传播是否已停止,如下所示:
protected function doDispatch($listeners, $eventName, Event $event)
{
foreach ($listeners as $listener) {
call_user_func($listener, $event, $eventName, $this);
if ($event->isPropagationStopped()) {
break;
}
}
}
这就是为什么Symfony2中的EventDispatcher实现Mediator模式而不是Event Aggregator模式吗?如果将检查isPropagationStopped的逻辑移出EventDispatcher(比如移到事件监听器中),那么这会实现Event Aggregator吗?