主义事件
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 4.4,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
主义事件
学说, 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 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;使用应用程序\实体\产品;使用学说\持久性\事件\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'
4.4
支持可调用侦听器(使用__invoke ()
method)在Symfony 4.4中引入。ob娱乐下载
信条生命周期订阅者
生命周期订阅者定义为实现主义\ \ 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
1 2 3 4 5 6 7
#配置/ services.yaml服务:#……App \ EventListener \ DatabaseActivitySubscriber:标签:-{名称:“doctrine.event_subscriber”,连接:“默认”}
提示
ob娱乐下载Symfony在应用程序执行时加载(并实例化)Doctrine订阅者;而Doctrine侦听器仅在相关事件实际触发时加载,使其性能更好。