当前位置: 首页 > 知识库问答 >
问题:

Symfony/EventSubscriber vs EntityListener

邢和光
2023-03-14

编辑:为了避免混淆,这个问题是关于实体侦听器的,而不是关于事件侦听器的

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

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

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

    if ($object instanceof xxxxxxx) {
        $this->doSomething();
    }
}

所以当我需要监听单个实体的事件时,我应该使用EntityListener,当我想要监听所有实体的事件时,我应该使用EventSubscriber。

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

我还没有看到使用EntityListener的包。

我的问题是:为什么?

从我的角度来看,EntityListener应该更有效,因为它只针对单个实体。打电话来说,每个实体更新都有20个预更新订阅者,这似乎不是很优化?

共有1个答案

毛博
2023-03-14

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

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

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

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

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

引用@stof关于事件监听器和事件订阅者之间的区别:

订阅者的主要优势(以及Symfony在2.1中切换到订阅者的原因)是,它将事件的知识保存在类中而不是服务定义中,从而更容易在其他上下文中重用侦听器(例如Silex,这就是Symfony代码被更改的原因)。

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

 类似资料:
  • 简单的模板功能 Symfony是一个开源的PHP Web框架。基于最佳Web开发实践,已经有多个网站完全采用此框架开发,Symfony的目的是加速Web应用的创建与维护。它的特点如下: 缓存管理 自定义URLs 搭建了一些基础模块 多语言与I18N支持 采用对象模型与MVC分离 Ajax支持 适用于企业应用开发。

  • 我犯了一个错误,我已经忙了两天了,一直在忙Symfony 2和MAMP pro。 错误消息是:警告:date_default_timezone_get():依赖系统的时区设置是不安全的。您需要使用date.timezone设置或date_default_timezone_set()函数。如果您使用了这些方法中的任何一种,并且您仍然收到此警告,您很可能拼错了时区标识符。我们现在选择了时区“UTC”,

  • Docker Symfony (PHP7-FPM - NGINX - MySQL - ELK) Docker-symfony gives you everything you need for developing Symfony application. This complete stack run with docker and docker-compose (1.7 or higher).

  • angular-symfony Project Bootstrap for an Angular 2+ and Symfony 4+ webservices project. Introduction This project is a template application with a secured RestFul API communication via JWT security sc

  • Symfony console autocomplete Enables shell autocompletion for tools based on theSymfony Console(Symfony framework, Composer, PHPSpec, Behat, etc.) Prerequisites Make sure the global composer project i

  • BASH/ZSH auto-complete for Symfony Console applications This package provides automatic (tab) completion in BASH and ZSH for Symfony Console Component based applications. With zero configuration, this

  • 问题内容: 我正在尝试在我的Symfony 2项目中实现一些Ajax功能。我想使用jquery的$ .post将一些数据发送回我的控制器。但是,当我仅POST数据时,就没有CSRF保护,因为symfony的csrf保护似乎仅适用于表单。 什么是实现此目的的简单方法? 使用表单时,我可以执行$ form-> isValid()来确定CSRF令牌是否通过。我目前正在将要发布的所有内容放入表单中,然后发

  • 我试图在我的symfony2项目中实现一些ajax功能。使用jquery的$。张贴我想发送一些数据回我的控制器。然而,当我刚刚发布数据时,没有CSRF保护,因为symfony的CSRF保护似乎只适用于表单。 有什么非常简单的方法来实现这一点? 使用表单时,我可以只做$form-