Symfony 侦听器与订户

Symfony 侦听器与订户,symfony,doctrine-orm,Symfony,Doctrine Orm,我在Symfony2框架中工作,想知道什么时候会使用一个订阅服务器而不是一个侦听器。对于听众的原则是非常明确的,然而订阅者却相当掩饰。Symfony与之类似。两者都允许您在持久化之前/之后对特定事件执行某些操作 但是,侦听器只允许您执行封装在实体中的行为。因此,一个例子可能是更新“date_edited”时间戳 如果需要移动到实体的上下文之外,则需要订阅服务器。一个很好的例子可能是调用外部API,或者如果您需要使用/检查与您的实体不直接相关的数据。在我看来,只有一个主要区别: 侦听器已注册,指

我在Symfony2框架中工作,想知道什么时候会使用一个订阅服务器而不是一个侦听器。对于听众的原则是非常明确的,然而订阅者却相当掩饰。Symfony与之类似。

两者都允许您在持久化之前/之后对特定事件执行某些操作

但是,侦听器只允许您执行封装在实体中的行为。因此,一个例子可能是更新“date_edited”时间戳


如果需要移动到实体的上下文之外,则需要订阅服务器。一个很好的例子可能是调用外部API,或者如果您需要使用/检查与您的实体不直接相关的数据。

在我看来,只有一个主要区别:

  • 侦听器已注册,指定其侦听的事件
  • 订阅者有一个方法告诉调度器它正在监听什么事件
这可能看起来没有太大的区别,但如果您仔细想想,在某些情况下,您希望使用其中一种:

  • 您可以将一个侦听器分配给具有不同事件的多个分派器,因为它们是在注册时设置的。您只需要确保每个方法都在侦听器中
  • 您可以通过更改
    getSubscribedEvents
    的返回值来更改订阅服务器在运行时注册的事件,甚至在注册订阅服务器之后也可以更改订阅服务器注册的事件(请考虑这样一种情况:您收听的事件非常嘈杂,您只想执行一次)

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

当您想要在一个类中处理多个事件时,您应该使用事件订阅服务器,例如,在这个类中,您可能会注意到事件侦听器只能管理一个事件,但假设您想要为一个实体处理多个事件,如prePersist、preUpdate、postPersist等。。。如果你使用事件监听器,你必须编写几个事件监听器,每个事件一个,但是如果你使用事件订阅服务器,你只需要编写一个类,事件订阅服务器,你可以在一个类中管理多个事件,这就是我使用它的方式,我先介绍一下模型业务所需的代码,其中一个例子是,如果您只想全局地为一组实体处理多个生命周期事件,那么您可以编写父类并在其中定义这些全局方法,然后让你的实体继承这个类,然后在你的事件订阅器中你订阅你想要的每一个事件,prePersist,preUpdate,postPersist等等。。。然后请求父类并执行这些全局方法

不知道这是意外还是故意的。。但订阅者的优先级比监听者高——

从原则的角度来看,它不在乎它是什么(监听器还是订阅者),最终两者都注册为监听器-


这就是我发现的。

另一件重要的事情:订阅服务器不允许您设置优先级


阅读更多关于这个问题的信息

以下是4.1中的文档内容。 由于这在全球范围内适用于事件,我认为它也适用于条令(不是100%确定)

听众或订阅者

监听器和订阅者可以在同一个应用程序中不明显地使用。使用它们中的任何一个通常都是一个问题 个人品味。然而,每种方法都有一些小的优点 其中:

  • 订阅者更容易重用,因为事件的知识保存在类中而不是服务定义中。 这是 Symfony在内部使用订户的原因
  • 监听器更灵活,因为捆绑包可以根据某些配置值有条件地启用或禁用每个监听器

来自文档:

侦听事件的最常见方式是注册事件 调度器的侦听器。此侦听器可以侦听一个或多个 事件,并在每次发送这些事件时收到通知

收听事件的另一种方式是通过事件订阅者。事件 subscriber是一个PHP类,它能够准确地告诉调度器 它应该订阅哪些活动。它实现了 EventSubscriberInterface接口,它需要一个静态 方法名为getSubscribedEvents()

请参见此处的示例:


我可能有误解,但这听起来像是生命周期回调和事件侦听器之间的区别?我正试图确定何时我可以使用(Symfony2术语)一个
原则。事件订阅者
而不是
原则。事件监听器
。罗斯·塔克几天前在DutchPHPConference上进行了一次原则2演讲。他还处理了Doctrine2中的事件,他的幻灯片在这里:也许这对你来说是一些额外的信息/帮助。你真的不需要自己代码中的侦听器。请参阅以获取更详细的答案。简言之,订阅者是监听器,其中监视的事件列表是可变的?在
getSubscribedEvents
中,我将返回一个数组,类似于
array(Events::prePersist,Events::postUpdate)
我猜是的。看看这里:@Sgoettschkes帖子中的链接被破坏了,当前的链接应该是@nurikabe。我读了你的评论,很好奇Symfony的订阅是否真的是可变的。订阅者只是预配置的侦听器,在同一级别比较它们是不完全正确的。订阅服务器包含侦听器,但侦听器不包含或不是订阅服务器(用Symfony术语)。我可能误解了您的意思,但根据我的经验,侦听器可以管理多个事件,例如,一个侦听器可以定义prePersist、preUpdate、onFlush、,等等。@ChadwickMeyer yup i second“此侦听器可以侦听一个或多个事件,并且每次这些事件被dispa时都会收到通知