如何(或在哪里)使用 Zend Framework 2 的 EventManager



我正在尝试使用Zend Framework 2的新事件管理器。我确实了解基本用法。但是我不确定如何在实际项目中使用它,或者更确切地说是使用代码的地方。

例如:在 Rob Allen 的介绍中(上面的链接),他在"findById"方法中触发了两个事件。侦听器的代码应该去哪里?在我看来,将此代码也放在 PhotoMapper 类中是没有意义的,还是我错了?

我承认我还没有强烈地使用它,但我认为你是对的,侦听器代码可能不应该在映射器中。相反,它可以在外部类中独立存在,因此它可以真正成为一个单一责任对象 - 处理他订阅的事件 - 并且代码可以尽可能保持 DRY。

作为第一步,我们可以定义听众需要什么来完成他的工作。有些事情他在实例化时就知道,有些事情需要在触发事件时传递。

例如,对于缓存侦听器,我可能会在 Bootstrap 上实例化他,其中包含有关缓存位置、生存期等的信息。甚至可以从缓存管理器资源中获取完全配置并准备好的缓存实例。这些可以是侦听器的构造函数参数。

然后,仍然可能在 Bootstrap 上,我会向事件管理器注册此侦听器,订阅您的事件并附加您希望在触发事件时运行的方法。当然,该方法签名需要与事件管理器将为您提供的信息兼容。

我想这个想法是这个侦听器对象具有以下潜在好处:

  1. 是单一责任,因此复杂性更低,更易于测试

  2. 希望足够通用,以便这个单个侦听器可以处理多个事件。

这里有一点皱纹。实例化和注册侦听器似乎不合理的性能影响,只是因为某些下游进程可能会触发他订阅的事件。这就是静态侦听器的用武之地。同样,注册是提前完成的(如 Bootstrap),但侦听器在真正需要之前不会实例化。

披露:我可能完全错了。所以如果有人想理顺我,那就太好了。;-)

最新更新