如何注册事件监听器和订阅者

编辑本页

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

本页的更新版本用于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
/ / src / AppBundle / EventListener / SearchIndexer.php名称空间AppBundleEventListener使用学说ORM事件LifecycleEventArgs使用AppBundle实体产品SearchIndexer公共函数postPersist(LifecycleEventArgsarg游戏实体arg游戏->getEntity ();//仅作用于某些“Product”实体如果(!实体运算符产品){返回;}entityManagerarg游戏->getEntityManager ();/ /……对产品做些什么}}

在每个事件中,你都可以访问一个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
/ / src / AppBundle / EventListener / SearchIndexerSubscriber.php名称空间AppBundleEventListener使用学说常见的EventSubscriber使用学说ORM事件LifecycleEventArgs//用于Doctrine 2.4: Doctrine\Common\Persistence\Event\LifecycleEventArgs;使用AppBundle实体产品SearchIndexerSubscriber实现了EventSubscriber公共函数getSubscribedEvents()返回数组“postPersist”“postUpdate”,);}公共函数postUpdate(LifecycleEventArgsarg游戏->指数(arg游戏);}公共函数postPersist(LifecycleEventArgsarg游戏->指数(arg游戏);}公共函数指数(LifecycleEventArgsarg游戏实体arg游戏->getEntity ();//也许你只想作用于某个"Product"实体如果实体运算符产品){entityManagerarg游戏->getEntityManager ();/ /……对产品做些什么}}}

提示

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

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

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。