主义事件

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.2,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

主义事件

学说,一组使用的PHP库Symfony使用数据库,提供了一个轻量级事件系统欧宝娱乐app下载地址更新实体在应用程序执行期间。这些事件,称为生命周期事件比如,允许执行任务“更新createdAt属性自动在这种类型的持久化实体”

教义触发事件之前/之后执行最常见的实体操作(如prePersist / postPersist,preUpdate / postUpdate(如)和其他常见的任务。loadClassMetadata,onClear)。

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

  • 生命周期回调,他们被定义为实体类公共方法,他们被称为当事件被触发;
  • 生命周期的听众和订阅者类,它们是与一个或多个事件的回调方法,他们呼吁所有实体;
  • 实体的听众他们类似于生命周期的听众,但它们仅呼吁一个特定类的实体。

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

  • 回调有更好的性能,因为它们只适用于一个单一的实体类,但是你不能重用不同的逻辑实体和他们没有访问权欧宝娱乐app下载地址Symfony的服务;
  • 生命周期的听众和订阅者可以重用不同实体之间的逻辑,可以访问Symfony的服务,但他们的表现更糟,因为他们是呼吁所有实体;欧宝娱乐app下载地址
  • 实体的听众有相同的生命周期的优点听众和他们有更好的性能,因为他们只适用于一个单一的实体类。

本文只解释了对基础主义事件在Symfony应用程序在使用它们。欧宝娱乐app下载地址读了官方文档原则活动学习关于他们的一切。

另请参阅

本文涵盖了听众和订阅者教义ORM。如果您正在使用ODM MongoDB,阅读DoctrineMongoDBBundle文欧宝体育电话档

教义的生命周期回调

生命周期回调函数被定义为在您想修改实体公共方法。例如,假设您想要设置一个createdAt日期列当前日期,但只有当实体是第一次保存(即插入)。为此,定义一个回调prePersist主义事件:

  • 注释
  • YAML
  • XML
1 2 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事件参数)。

生命周期原则听众

生命周期的听众被定义为PHP类,听一个教义事件在所有应用程序实体。例如,假设你想更新一些搜索索引,每当一个新实体保存在数据库中。为此,定义一个侦听器postPersist主义事件:

1 2 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;使用应用程序\实体\产品;使用学说\持久性\事件\LifecycleEventArgs;SearchIndexer{/ /侦听器方法接收一个参数可以让你接触/ /事件的实体对象和实体管理器本身公共函数postPersist(LifecycleEventArgs美元arg游戏):无效{美元实体=美元arg游戏- >getObject ();/ /如果该侦听器只适用于特定的实体类型,/ /添加一些代码来检查尽早实体类型如果(!美元实体运算符产品){返回;}美元entityManager=美元arg游戏- >getObjectManager ();/ /……做一些与产品的实体}}

下一步是使教义侦听器在Symfony应用程序为,通过创建一个新的服务欧宝娱乐app下载地址标记它doctrine.event_listener标签:

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

提示

欧宝娱乐app下载地址Symfony加载(实例化)教义的听众只有当相关原则,事件实际上是解雇;而教条用户总是由Symfony加载(实例化),使他们更少的性能。欧宝娱乐app下载地址

教义实体听众

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

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

下一步是使教义侦听器在Symfony应用程序为,通过创建一个新的服务欧宝娱乐app下载地址标记它doctrine.orm.entity_listener标签:

  • YAML
  • XML
  • PHP
1 2 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”实体:“应用程序实体\ \用户”#这是其他选项,您可能定义如果需要#设置“懒惰”选项来真只有实例化侦听器时使用#懒惰:真#设置“entity_manager”选项如果听者没有关联到默认的经理# entity_manager:“自定义”#默认情况下,Symfony欧宝娱乐app下载地址查找一个名为事后的方法(如postUpdate ())#如果它不存在,它试图执行__invoke()的方法,但是你可以#配置自定义方法名称与“方法”选项#方法:“checkUserChanges”

教义用户生命周期

用户生命周期定义为PHP类,实现主义\ \ EventSubscriber接口和听一个或多个主义事件在所有应用程序实体。例如,假设您想要记录所有数据库活动。为此,定义一个用户postPersist,postRemovepostUpdate主义事件:

1 2 3 4 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;使用应用程序\实体\产品;使用学说\常见的\EventSubscriber;使用学说\ORM\事件;使用学说\持久性\事件\LifecycleEventArgs;DatabaseActivitySubscriber实现了EventSubscriber{/ /这个方法只能返回事件名称;你不能定义一个/ /自定义每个事件触发时执行的方法名称公共函数getSubscribedEvents():数组{返回(事件::postPersist、事件::postRemove、事件::postUpdate);}/ /回调方法必须调用完全一样的事件他们听;/ /他们收到LifecycleEventArgs类型的一个论点,它给你访问/ /事件的实体对象和实体管理器本身公共函数postPersist(LifecycleEventArgs美元arg游戏):无效{美元- >logActivity (“坚持”,美元arg游戏);}公共函数postRemove(LifecycleEventArgs美元arg游戏):无效{美元- >logActivity (“删除”,美元arg游戏);}公共函数postUpdate(LifecycleEventArgs美元arg游戏):无效{美元- >logActivity (“更新”,美元arg游戏);}私人函数logActivity(字符串美元行动,LifecycleEventArgs美元arg游戏):无效{美元实体=美元arg游戏- >getObject ();/ /如果用户只适用于特定的实体类型,/ /添加一些代码来检查尽早实体类型如果(!美元实体运算符产品){返回;}/ /……得到实体信息和日志}}

下一步是使教义订户在Symfony应用程序为,通过创建一个新的服务欧宝娱乐app下载地址标记它doctrine.event_subscriber标签:

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

如果您需要将用户与特定的教义连接,你可以在服务配置:

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

提示

欧宝娱乐app下载地址Symfony加载(实例化)原则,用户只要应用程序执行;而教条听众只加载相关事件时实际上是解雇,使他们更好的性能。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。