主义事件

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 4.4,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

主义事件

学说, Symfony使用的一组PHP库来处理数据库,它提供了一个轻量级事ob娱乐下载件系统来在应用程序执行期间更新实体。这些事件被称为生命周期事件,允许执行任务,如在持久化此类型的实体之前自动更新createdAt属性

Doctrine在执行最常见的实体操作之前/之后触发事件(例如;prePersist / postPersistpreUpdate / postUpdate)和其他常见的任务(例如:loadClassMetadataonClear).

听这些教义事件有不同的方法:

  • 生命周期回调,它们被定义为实体类上的公共方法,并在事件触发时调用它们;
  • 生命周期监听器和订阅者,它们是为一个或多个事件提供回调方法的类,并且它们为所有实体调用;
  • 实体的听众,它们类似于生命周期侦听器,但它们仅为某个类的实体调用。

这些是缺点和优点每一个:

  • 回调具有更好的性能,因为它们只应用于单个实体类,但您不能为不同的实体重用逻辑,而且它们无法访问ob娱乐下载Symfony的服务
  • 生命周期侦听器和订阅者可以在不同实体之间重用逻辑,并可以访问Symfony服务,但它们的性能较差,因为它们是为所有实体调用的;ob娱乐下载
  • 实体侦听器具有与生命周期侦听器相同的优点,并且它们具有更好的性能,因为它们只应用于单个实体类。

本文仅解释在Symfony应用程序中使用Doctrine事件时的基本知识。ob娱乐下载读了关于教义事件的官方文件去了解他们的一切。

另请参阅

本文介绍Doctrine ORM的侦听器和订阅者。如果您正在为MongoDB使用ODM,请阅读DoctrineMongoDBBundle文欧宝官网下载app档

原则生命周期回调

生命周期回调定义为要修改的实体中的公共方法。例如,假设你想要设置一个createdAtDate列到当前日期,但仅当实体第一次被持久化(即插入)时。方法的回调函数prePersist主义事件:

  • 注释
  • YAML
  • XML
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/ / src /实体/ Product.php名称空间应用程序实体使用学说ORM映射作为ORM//当使用注释时,不要忘记添加@ORM\HasLifecycleCallbacks()//到定义回调的实体的类/ * * *@ORM() * \实体@ORM\ HasLifecycleCallbacks () * /产品/ /……/ * * *@ORM\ PrePersist * /公共函数setCreatedAtValue()无效->createdAt =\ DateTimeImmutable ();}}

请注意

一些生命周期回调接收一个参数,该参数提供对有用信息的访问,例如当前实体管理器(例如preUpdate回调函数接收一个美元PreUpdateEventArgs事件参数)。

信条生命周期监听器

生命周期侦听器被定义为侦听所有应用程序实体上的单个Doctrine事件的PHP类。例如,假设您希望在数据库中持久化一个新实体时更新某个搜索索引。方法定义侦听器postPersist主义事件:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/ / src / EventListener / SearchIndexer.php名称空间应用程序EventListener使用应用程序实体产品使用学说持久性事件LifecycleEventArgsSearchIndexer//监听器方法接收一个参数,该参数允许你访问//事件的实体对象和实体管理器本身公共函数postPersist(LifecycleEventArgsarg游戏无效实体arg游戏->getObject ();//如果这个监听器只应用于某些实体类型,//添加一些代码来尽早检查实体类型如果(!实体运算符产品){返回;}entityManagerarg游戏->getObjectManager ();/ /……对Product实体做些什么}}

下一步是在Symfony应用程序中启用Doctrine侦听器,方法是为它创建一个新服务ob娱乐下载标记它doctrine.event_listener标签:

  • YAML
  • XML
  • PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#配置/ services.yaml服务:#……App \ EventListener \ SearchIndexer:标签:-名称:“doctrine.event_listener”#这是生命周期监听器标签唯一需要的选项事件:“postPersist”# listener可以在多个监听器相关联的情况下定义它们的优先级#到同一事件(默认优先级= 0;更高的数字=侦听器更早运行)优先级:500#您还可以将侦听器限制到特定的Doctrine连接连接:“默认”

提示

ob娱乐下载Symfony只有在相关的Doctrine事件实际触发时才加载(并实例化)Doctrine侦听器;而Doctrine订阅者总是由Symfony加载(并实例化),这使得它们的性能较差。ob娱乐下载

原则实体监听器

实体侦听器被定义为侦听单个实体类上的单个Doctrine事件的PHP类。例如,假设您想要发送一些通知用户实体在数据库中被修改。方法定义侦听器postUpdate主义事件:

12 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src / EventListener / UserChangedNotifier.php名称空间应用程序EventListener使用应用程序实体用户使用学说持久性事件LifecycleEventArgsUserChangedNotifier//实体监听器方法接收两个参数://实体实例和生命周期事件公共函数postUpdate(用户用户, LifecycleEventArgs事件无效/ /……做些什么来通知这些变化}}

下一步是在Symfony应用程序中启用Doctrine侦听器,方法是为它创建一个新服务ob娱乐下载标记它doctrine.orm.entity_listener标签:

  • YAML
  • XML
  • PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#配置/ services.yaml服务:#……App \ EventListener \ UserChangedNotifier:标签:-这些是定义实体监听器所需的选项名称:“doctrine.orm.entity_listener”事件:“postUpdate”实体:“应用程序实体\ \用户”#这些是您可以在需要时定义的其他选项#设置'lazy'选项为TRUE,只在使用侦听器时实例化侦听器# lazy: true如果监听器没有关联到默认管理器,则设置'entity_manager'选项# entity_manager:自定义#默认情况下,Symfonyob娱乐下载会在事件发生后寻找被调用的方法(例如postUpdate())#如果它不存在,它会尝试执行'__invoke()'方法,但你可以#使用'method'选项配置一个自定义方法名#方法:'checkUserChanges'

4.4

支持可调用侦听器(使用__invoke ()method)在Symfony 4.4中引入。ob娱乐下载

信条生命周期订阅者

生命周期订阅者定义为实现主义\ \ EventSubscriber接口,监听所有应用实体上的一个或多个Doctrine事件。例如,假设您想记录所有的数据库活动。属性的订阅者postPersistpostRemove而且postUpdate主义事件:

12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
/ / src / EventListener / DatabaseActivitySubscriber.php名称空间应用程序EventListener使用应用程序实体产品使用学说DoctrineBundleEventSubscriberEventSubscriberInterface使用学说ORM事件使用学说持久性事件LifecycleEventArgsDatabaseActivitySubscriber实现了EventSubscriberInterface//该方法只能返回事件名称;你不能定义//当每个事件触发时执行的自定义方法名公共函数getSubscribedEvents()数组返回(事件::postPersist、事件::postRemove、事件::postUpdate);}//回调方法的调用必须与它们侦听的事件完全相同;//它们接收类型为LifecycleEventArgs的参数,该参数允许您访问//事件的实体对象和实体管理器本身公共函数postPersist(LifecycleEventArgsarg游戏无效->logActivity (“坚持”arg游戏);}公共函数postRemove(LifecycleEventArgsarg游戏无效->logActivity (“删除”arg游戏);}公共函数postUpdate(LifecycleEventArgsarg游戏无效->logActivity (“更新”arg游戏);}私人函数logActivity(字符串行动, LifecycleEventArgsarg游戏无效实体arg游戏->getObject ();//如果这个订阅者只适用于某些实体类型,//添加一些代码来尽早检查实体类型如果(!实体运算符产品){返回;}/ /……获取实体信息并以某种方式记录它}}

如果你在用默认的服务。yaml的配置和DoctrineBundle 2.1(2020年5月25日发布)或更新版本,这个例子已经工作了!否则,创建服务对于此订阅者和标记它doctrine.event_subscriber

如果您需要将订阅者与特定的Doctrine连接关联,则必须在手动服务配置中执行此操作:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7
#配置/ services.yaml服务:#……App \ EventListener \ DatabaseActivitySubscriber:标签:-名称:“doctrine.event_subscriber”连接:“默认”

提示

ob娱乐下载Symfony在应用程序执行时加载(并实例化)Doctrine订阅者;而Doctrine侦听器仅在相关事件实际触发时加载,使其性能更好。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。