事件监听器和订阅器

编辑本页

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

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

事件监听器和订阅器

Doctrine包有一个丰富的事件系统,当系统内几乎发生任何事情时,它都会触发事件。对您来说,这意味着您可以任意创建服务并告诉Doctrine在任何时候通知这些对象某个动作(例如:prePersist ())发生在教义中。这可能很有用,例如,每当保存数据库中的对象时,都可以创建一个独立的搜索索引。

Doctrine定义了两种可以侦听Doctrine事件的对象:侦听器和订阅者。两者都非常相似,但是侦听器更直接一些。有关更多信息,请参见事件系统在Doctrine的网站上。

教义网站还解释了所有可以收听的现有事件。

配置监听器/订阅者

要注册一个服务来充当事件监听器或订阅者,您只需要标签它具有适当的名称。根据您的用例,您可以将侦听器连接到每个DBAL连接和ORM实体管理器,或者仅将侦听器连接到一个特定的DBAL连接和使用此连接的所有实体管理器。

  • YAML
  • XML
  • PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21
原则:dbal:default_connection:默认的连接:默认值:司机:pdo_sqlite记忆:真正的服务:my.listener:类:AppBundle \ EventListener \ SearchIndexer标签:-名称:doctrine.event_listener,事件:postPersistmy.listener2:类:AppBundle \ EventListener \ SearchIndexer2标签:-名称:doctrine.event_listener,事件:postPersist,连接:默认的my.subscriber:类:AppBundle \ EventListener \ SearchIndexerSubscriber标签:-名称:doctrine.event_subscriber,连接:默认的

创建侦听器类

在前面的例子中,是一个服务my.listener被配置为事件上的Doctrine监听器postPersist.该服务背后的类必须具有postPersist ()方法,该方法将在事件分派时被调用:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
/ / src / AppBundle / EventListener / SearchIndexer.php名称空间AppBundleEventListener//对于Doctrine < 2.4:使用Doctrine\ORM\Event\LifecycleEventArgs;使用学说常见的持久性事件LifecycleEventArgs使用AppBundle实体产品SearchIndexer公共函数postPersist(LifecycleEventArgsarg游戏实体arg游戏->getObject ();//仅作用于某些“Product”实体如果(!实体运算符产品){返回;}entityManagerarg游戏->getObjectManager ();/ /……对产品做些什么}}

在每个事件中,你都可以访问一个LifecycleEventArgs对象,它使您可以访问事件的实体对象和实体管理器本身。

要注意的一件重要的事情是听者会听什么所有应用程序中的实体。因此,如果您只对处理特定类型的实体感兴趣(例如a产品实体,而不是博客实体),您应该在方法中检查实体的类类型(如上所示)。

提示

在Doctrine 2.4中,引入了一个称为实体监听器的特性。它是用于实体的生命周期侦听器类。你可以在教义文件欧宝官网下载app

创建订阅者类

Doctrine事件订阅者必须实现主义\ \ EventSubscriber接口,并为它订阅的每个事件提供一个事件方法:

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
/ / src / AppBundle / EventListener / SearchIndexerSubscriber.php名称空间AppBundleEventListener使用学说常见的EventSubscriber//对于Doctrine < 2.4:使用Doctrine\ORM\Event\LifecycleEventArgs;使用学说常见的持久性事件LifecycleEventArgs使用学说ORM事件使用AppBundle实体产品SearchIndexerSubscriber实现了EventSubscriber公共函数getSubscribedEvents()返回数组(事件::postPersist、事件::postUpdate);}公共函数postUpdate(LifecycleEventArgsarg游戏->指数(arg游戏);}公共函数postPersist(LifecycleEventArgsarg游戏->指数(arg游戏);}公共函数指数(LifecycleEventArgsarg游戏实体arg游戏->getObject ();//也许你只想作用于某个"Product"实体如果实体运算符产品){entityManagerarg游戏->getObjectManager ();/ /……对产品做些什么}}}

提示

事件订阅者不能返回灵活的方法数组来调用事件,例如ob娱乐下载Symfony事件订阅器可以。Doctrine事件订阅者必须返回其订阅的事件名称的简单数组。Doctrine将期望订阅者上的方法与每个订阅的事件具有相同的名称,就像使用事件侦听器时一样。

要获得完整的参考,请参见章节事件系统在Doctrine文档中。欧宝官网下载app

事件监听器的惰性加载

监听器和订阅者之间的一个细微区别是,Symfony可以延迟加载实体监听器。ob娱乐下载这意味着侦听器类只有在其链接到的事件实际触发时才会从服务容器中获取(并因此被实例化)。

当侦听器运行很少触发的事件时,延迟加载可能会略微提高性能。此外,它可以帮助你当你遇到循环依赖问题当侦听器服务依赖于DBAL连接时,可能会发生这种情况。

要将侦听器服务标记为惰性加载,只需添加懒惰的属性添加到标签,如下所示:

  • YAML
  • XML
  • PHP
1 2 3 4 5
服务:my.listener:类:AppBundle \ EventListener \ SearchIndexer标签:-名称:doctrine.event_listener,事件:postPersist,懒惰:真正的

请注意

将事件侦听器标记为懒惰的与所描述的惰性服务定义无关在他们自己的文章中

事件监听器的优先级

类控件控制同一个事件的多个侦听器的调用顺序优先级属性。优先级用正整数或负整数定义(默认为0).数值越大,监听器就越早被调用。

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10
服务:my.listener.with_high_priority:类:AppBundle \ EventListener \ MyHighPriorityListener标签:-名称:doctrine.event_listener,事件:postPersist,优先级:10my.listener.with_low_priority:类:AppBundle \ EventListener \ MyLowPriorityListener标签:-名称:doctrine.event_listener,事件:postPersist,优先级:1
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。