主义事件
编辑本页主义事件
学说, Symfony使用的一组PHP库来处理数据库,它提供了一个轻量级事ob娱乐下载件系统来在应用程序执行期间更新实体。这些事件被称为生命周期事件,允许执行任务,如在持久化此类型的实体之前自动更新createdAt属性.
Doctrine在执行最常见的实体操作之前/之后触发事件(例如;prePersist / postPersist
,preUpdate / postUpdate
)和其他常见的任务(例如:loadClassMetadata
,onClear
).
听这些教义事件有不同的方法:
- 生命周期回调,它们被定义为实体类上的公共方法,并在事件触发时调用它们;
- 生命周期监听器和订阅者,它们是为一个或多个事件提供回调方法的类,并且它们为所有实体调用;
- 实体的听众,它们类似于生命周期侦听器,但它们仅为某个类的实体调用。
这些是缺点和优点每一个:
- 回调具有更好的性能,因为它们只应用于单个实体类,但您不能为不同的实体重用逻辑,而且它们无法访问ob娱乐下载Symfony的服务;
- 生命周期侦听器和订阅者可以在不同实体之间重用逻辑,并可以访问Symfony服务,但它们的性能较差,因为它们是为所有实体调用的;ob娱乐下载
- 实体侦听器具有与生命周期侦听器相同的优点,并且它们具有更好的性能,因为它们只应用于单个实体类。
本文仅解释在Symfony应用程序中使用Doctrine事件时的基本知识。ob娱乐下载读了关于教义事件的官方文件去了解他们的一切。
另请参阅
本文介绍Doctrine ORM的侦听器和订阅者。如果您正在为MongoDB使用ODM,请阅读DoctrineMongoDBBundle文欧宝官网下载app档.
原则生命周期回调
生命周期回调定义为要修改的实体中的公共方法。例如,假设你想要设置一个createdAt
Date列到当前日期,但仅当实体第一次被持久化(即插入)时。方法的回调函数prePersist
主义事件:
- 属性
- YAML
- XML
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
/ / 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;使用应用程序\实体\产品;使用学说\持久性\事件\LifecycleEventArgs;类SearchIndexer{//监听器方法接收一个参数,该参数允许你访问//事件的实体对象和实体管理器本身公共函数postPersist(LifecycleEventArgs$arg游戏):无效{$实体=$arg游戏->getObject ();//如果这个监听器只应用于某些实体类型,//添加一些代码来尽早检查实体类型如果(!$实体运算符产品){返回;}$entityManager=$arg游戏->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;使用应用程序\实体\用户;使用学说\持久性\事件\LifecycleEventArgs;类UserChangedNotifier{//实体监听器方法接收两个参数://实体实例和生命周期事件公共函数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'
信条生命周期订阅者
生命周期订阅者定义为实现主义\ \ EventSubscriber
接口,监听所有应用实体上的一个或多个Doctrine事件。例如,假设您想记录所有的数据库活动。属性的订阅者postPersist
,postRemove
而且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;使用应用程序\实体\产品;使用学说\包\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
.
如果你需要配置订阅者的某些选项(例如它的优先级或Doctrine连接使用),你必须在手动服务配置中这样做:
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13 14
#配置/ services.yaml服务:#……App \ EventListener \ DatabaseActivitySubscriber:标签:-名称:“doctrine.event_subscriber”#订阅者可以在多个订阅者或监听器相关联的情况下定义它们的优先级#到同一事件(默认优先级= 0;更高的数字=侦听器更早运行)优先级:500#您还可以将侦听器限制到特定的Doctrine连接连接:“默认”
提示
ob娱乐下载Symfony在应用程序执行时加载(并实例化)Doctrine订阅者;而Doctrine侦听器仅在相关事件实际触发时加载,使其性能更好。