Doctrine Listener与Subscriber

nur*_*abe 73 symfony doctrine-orm

我正在使用Symfony2框架,并想知道何时使用Doctrine订阅者而不是听众.Doctrine 为听众提供的文档非常清晰,但是订阅者却被掩盖了.Symfony的食谱入门类似.

Sgo*_*kes 86

从我的角度来看,只有一个主要区别:

  • 监听器已注册,指定它侦听的事件.
  • 订阅者有一种方法告诉调度员它正在侦听哪些事件

这可能看起来不是一个很大的区别,但是如果你考虑一下,有些情况下你想要使用一个而不是另一个:

  • 您可以为具有不同事件的多个调度程序分配一个侦听器,因为它们是在注册时设置的.您只需要确保每个方法都在侦听器中
  • 您可以在运行时更改订阅者注册的事件,甚至可以通过更改返回值来注册订阅者getSubscribedEvents(想想您听一个非常嘈杂的事件的时间而您只想执行一次)

可能还有其他我不知道的差异!

  • 那么,简而言之,订阅者是一个监听器,其中受监视事件的列表是可变的?在`getSubscribedEvents`中我会返回一个数组,比如`array(Events :: prePersist,Events :: postUpdate)`我想? (19认同)
  • 是.看看这里:http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/events.html#the-event-system (6认同)

Rus*_*gan 9

不知道是不是意外地或故意地完成了..但是订阅者具有更高的听众优先级 - https://github.com/symfony/symfony/blob/master/src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass .php#如果L73-L98

从学说方面来看,它并不关心它是什么(听众或订阅者),最终都被注册为听众 - https://github.com/doctrine/common/blob/master/lib/Doctrine/Common/EventManager.php #L137-L140

这就是我发现的.


met*_*rez 7

当你想在一个类中处理多个事件时,你应该使用事件订阅者,例如在这篇symfony2文档页面文章中,人们可能会注意到事件监听器只能管理一个事件,但是假设你想要为一个事件处理多个事件实体,prePersist,preUpdate,postPersist等...如果你使用事件监听器,你必须编写几个事件监听器,每个事件一个,但如果你去事件用户,你只需要编写一个类事件susbcriber,看看使用事件订阅者,您可以在一个类中管理多个事件,这就是我使用它的方式,我更倾向于将代码集中在模型业务需要的地方,这可能是您想要处理几个生命周期事件的一个示例只为一组实体,你可以编写一个父类并在其中定义那些全局方法,然后让你的实体继承该类,然后在你的事件中,你订阅你想要的每个事件,prePersist,preUpdate,po stPersist等...然后请求该父类并执行这些全局方法.

  • 我可能误解了你,但根据我的经验,监听器可以管理多个事件,例如一个监听器可以为prePersist,preUpdate,onFlush等定义动作. (3认同)