2012-05-24 60 views
57

我在Symfony2框架中工作,想知道何时会使用Doctrine订户而不是听众。对于听众而言,Doctrine的documentation非常清晰,但用户相当掩饰。 Symfony的cookbook entry与此类似。学说听众与订阅者

+0

罗斯塔克有Doctrine2对DutchPHPConference谈了一些天前。他还在Doctrine2中处理了这些事件,他的幻灯片在这里:http://www.slideshare.net/rosstuck/extending-doctrine-2-for-your-domain-model-13257781也许它可能是一些额外的信息/帮助为你。 –

回答

66

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

  • 监听器被注册,指定所侦听的事件。
  • 认购人告诉哪些事件是听

这看起来可能是一个很大的区别调度的方法,但是如果你想想看,当你想通过使用一个有一些情况另一个:

  • 您可以将一个侦听器分配给具有不同事件的多个调度器,因为它们是在注册时设置的。您只需确保每个方法都在收听者处就位
  • 您可以更改用户在运行时注册的事件,甚至可以在注册用户之后通过更改getSubscribedEvents的返回值(考虑您收听的时间到一个非常嘈杂的事件,你只想执行一次)

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

+16

所以,简而言之,订阅者是一个监听者,监听的事件列表是可变的吗?在'getSubscribedEvents'中,我会返回一个数组,类似'array(Events :: prePersist,Events :: postUpdate)'我猜? – nurikabe

+5

是的。看看这里:http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/events.html#the-event-system – Sgoettschkes

5

都允许您在一个特定事件前/后执行的东西依然存在等

但是听众只允许你执行你的实体包裹内的行为。所以一个例子可能是更新“date_edited”时间戳。

如果您需要移出实体环境,那么您需要订阅者。一个很好的例子可能是调用外部API,或者如果您需要使用/检查与您的实体不直接相关的数据。

+5

我可能会误解,但这听起来像生命周期回调和事件侦听器之间的区别?我试图确定何时可以使用(以Symfony2术语)“doctrine.event_subscriber”而不是“doctrine.event_listener”。 – nurikabe

+0

你的权利,我误解了你的问题,表示歉意。 –

7

当你想要在一个类中处理多个事件时,你应该使用事件订阅者,例如在这个symfony2 doc page article中,可能会注意到事件侦听器只能管理一个事件,但可以说你想处理几个事件一个实体,prePersist,preUpdate,postPersist等等...如果你使用事件监听器,你将不得不编写几个事件监听器,每个事件监听器一个,但是如果你使用事件订阅者,你只需要编写一个事件驱动器类,通过事件订阅者,您可以在一个类中管理多个事件,这就是我使用它的方式,我主要关注的是模型业务需要的代码,其中一个例子可能是您希望处理多个生命周期事件globaly只适用于一组实体,要做到这一点,您可以编写一个父类并在其中定义这些全局方法,然后让哟你的实体继承这个类,然后在你的事件中,你订阅你想要的每个事件,prePersist,preUpdate,postPersist等......然后请求这个父类并执行这些全局方法。

+3

我可能误解了你,但在我的体验Listener可以管理多个事件,例如一个Listener可以为prePersist,preUpdate,onFlush等定义动作。 –

+0

@ChadwickMeyer其次,'这个监听器可以监听一个或多个事件,并在每次调度这些事件时收到通知。'直接从文档 – Dheeraj

2

另一件重要的事情:Doctrine EventSubscribers不允许您设置优先级。

了解更多关于这个问题here

+0

灯泡继续。谢谢! – nurikabe