主义事件
编辑该页面主义事件
学说,一组使用的PHP库Symfony使用数据库,提供了一个轻量级事件系统ob娱乐下载更新实体在应用程序执行期间。这些事件,称为生命周期事件比如,允许执行任务“更新createdAt属性自动在这种类型的持久化实体”。
教义触发事件之前/之后执行最常见的实体操作(如prePersist / postPersist
,preUpdate / postUpdate
(如)和其他常见的任务。loadClassMetadata
,onClear
)。
有不同的方式来听这些教义的事件:
- 生命周期回调,他们被定义为实体类公共方法,他们被称为当事件被触发;
- 生命周期的听众和订阅者类,它们是与一个或多个事件的回调方法,他们呼吁所有实体;
- 实体的听众他们类似于生命周期的听众,但它们仅呼吁一个特定类的实体。
这些都是缺点和优点每一个人:
- 回调有更好的性能,因为它们只适用于一个单一的实体类,但是你不能重用不同的逻辑实体和他们没有访问权ob娱乐下载Symfony的服务;
- 生命周期的听众和订阅者可以重用不同实体之间的逻辑,可以访问Symfony的服务,但他们的表现更糟,因为他们是呼吁所有实体;ob娱乐下载
- 实体的听众有相同的生命周期的优点听众和他们有更好的性能,因为他们只适用于一个单一的实体类。
本文只解释了对基础主义事件在Symfony应用程序在使用它们。ob娱乐下载读了官方文档原则活动学习关于他们的一切。
另请参阅
本文涵盖了听众和订阅者教义ORM。如果您正在使用ODM MongoDB,阅读DoctrineMongoDBBundle文欧宝官网下载app档。
教义的生命周期回调
生命周期回调函数被定义为在您想修改实体公共方法。例如,假设您想要设置一个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应用程序为,通过创建一个新的服务ob娱乐下载标记它与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年#你也可以限制听众连接到一个特定的教义连接:“默认”
提示
ob娱乐下载Symfony加载(实例化)教义的听众只有当相关原则,事件实际上是解雇;而教条用户总是由Symfony加载(实例化),使他们更少的性能。ob娱乐下载
教义实体听众
实体的听众被定义为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应用程序为,通过创建一个新的服务ob娱乐下载标记它与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:“自定义”#默认情况下,Symfonyob娱乐下载查找一个名为事后的方法(如postUpdate ())#如果它不存在,它试图执行__invoke()的方法,但是你可以#配置自定义方法名称与“方法”选项#方法:“checkUserChanges”
教义用户生命周期
用户生命周期定义为PHP类,实现主义\ \ EventSubscriber
接口和听一个或多个主义事件在所有应用程序实体。例如,假设您想要记录所有数据库活动。为此,定义一个用户postPersist
,postRemove
和postUpdate
主义事件:
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;使用应用程序\实体\产品;使用学说\包\DoctrineBundle\EventSubscriber\EventSubscriberInterface;使用学说\ORM\事件;使用学说\持久性\事件\LifecycleEventArgs;类DatabaseActivitySubscriber实现了EventSubscriberInterface{/ /这个方法只能返回事件名称;你不能定义一个/ /自定义每个事件触发时执行的方法名称公共函数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 ();/ /如果用户只适用于特定的实体类型,/ /添加一些代码来检查尽早实体类型如果(!美元实体运算符产品){返回;}/ /……得到实体信息和日志}}
如果你使用默认的服务。yaml的配置和DoctrineBundle 2.1(2020年5月25日发布)或更新,这个示例将已经工作!否则,创建一个服务用户和标记它与doctrine.event_subscriber
。
如果您需要配置一些选项的用户(例如,其优先级或教义连接用)你必须用手工服务配置:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#配置/ services.yaml服务:#……App \ EventListener \ DatabaseActivitySubscriber:标签:- - - - - -名称:“doctrine.event_subscriber”#用户可以定义自己的优先级情况下多个订阅者或听众相关联#相同的事件(默认优先级= 0;更高的数字=侦听器运行前)优先级:500年#你也可以限制听众连接到一个特定的教义连接:“默认”
5.3
用户优先级是在Symfony 5.3中引入的。ob娱乐下载
提示
ob娱乐下载Symfony加载(实例化)原则,用户只要应用程序执行;而教条听众只加载相关事件时实际上是解雇,使他们更好的性能。