Doctrine Symfony/EventSubscriber vs EntityListener

Doctrine Symfony/EventSubscriber vs EntityListener,doctrine,symfony,Doctrine,Symfony,编辑:为了避免混淆,这个问题是关于和而不是关于 我正在学习Symfony事件,并研究EntityListeners和EventSubscribers是如何工作的 据我所知,EntityListener只连接到一个实体,而EventSubscriber方法会被所有实体调用。最终,在EventSubscriber类中,我必须执行以下操作: public function prePersist(LifecycleEventArgs $args) { $object = $args->ge

编辑:为了避免混淆,这个问题是关于和而不是关于

我正在学习Symfony事件,并研究EntityListeners和EventSubscribers是如何工作的

据我所知,EntityListener只连接到一个实体,而EventSubscriber方法会被所有实体调用。最终,在EventSubscriber类中,我必须执行以下操作:

public function prePersist(LifecycleEventArgs $args)
{
    $object = $args->getObject();

    if ($object instanceof xxxxxxx) {
        $this->doSomething();
    }
}
所以当我需要监听单个实体的事件时,我应该使用EntityListener,当我想要监听所有实体的事件时,我应该使用EventSubscriber

但是。。。看看最流行的bundle,比如FOSUserBundle、VichUploaderBundle、SonataMediaBundle等,它们都使用EventSubscriber接口,没有一个使用EntityListener。即使他们只需要听一个实体

我还没有看到使用EntityListener的包

我的问题是:为什么

在我看来,EntityListener应该更高效,因为它只为单个实体激发。打电话说每个实体更新20个预更新订阅者似乎不是很优化

EntityListener仅附加到一个实体,而EventSubscriber 为所有实体调用方法

无法将EntityListeners与EventListeners/EventSubscribers进行比较

与实现事件侦听器不同,实体侦听器仅对指定的实体调用。

实体侦听器:
实体侦听器是用于实体的生命周期侦听器类。

甚至监听器:
它们位于实体之上,允许您跨不同的实体类实现可重用的行为。

引用事件侦听器和事件订阅者之间的差异:

用户的主要优势(以及Symfony切换的原因) 在2.1)中,对他们来说,它将事件的知识保存在 类,而不是在服务定义中,使其更易于重用 其他上下文中的侦听器(例如Silex,这就是为什么 Symfony代码已更改)

另一方面,通过服务定义注册侦听器 为捆绑包的DI设置提供了更大的灵活性(允许添加 标记有条件地基于配置(例如)


您确定您指的是EntityListener而不是EventListener吗?EntityListener似乎已添加到Symfony 2.4中,您正在混合内容。EntityListener不是EventListener/EventsSubscriber。他们在不同层次的学说上工作。检查我的最新答案。