学说事件监听器和用户

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 3.4,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

学说事件监听器和用户

教义包有一个丰富的事件系统,火灾事件时几乎任何系统内部发生。对于你,这意味着您可以创建任意的服务并告诉教义通知只要某一行动(如那些对象。prePersist ())发生在教义。这可能是有用的,例如,要创建一个独立的搜索索引对象保存在数据库中。

理论定义了两种类型的对象可以听教义事件:听众和订阅者。都非常相似,但听众更简单。更多信息,见事件系统对教义的文档。欧宝官网下载app

在使用之前,请记住,用于持久性钩子(即学说事件。“拯救还当储蓄,“)。他们不应该用于域逻辑,如日志记录的变化,设置updatedAtcreatedAt属性,等等。

另请参阅

本文涵盖了听众和订阅者教义ORM。如果您正在使用ODM MongoDB,阅读DoctrineMongoDBBundle文欧宝官网下载app档

配置监听器/订阅者

注册一个服务作为一个事件侦听器或订户你只需要标签它与适当的名字。根据你的用例,可以钩一个监听器到每个DBAL连接和ORM实体管理器或者只是为一个特定DBAL连接和所有使用此连接的实体管理器。

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12
服务:#……AppBundle \ EventListener \ SearchIndexer:标签:- - - - - -{名称:doctrine.event_listener,事件:postPersist}AppBundle \ EventListener \ SearchIndexer2:标签:- - - - - -{名称:doctrine.event_listener,事件:postPersist,连接:默认的}AppBundle \ EventListener \ SearchIndexerSubscriber:标签:- - - - - -{名称:doctrine.event_subscriber,连接:默认的}

创建侦听器类

在前面的例子中,一个SearchIndexer服务配置为教义的事件侦听器postPersist。该服务必须有一个背后的阶级postPersist ()方法,该方法将调用事件时派遣:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/ / src / AppBundle / EventListener / SearchIndexer.php名称空间AppBundle\EventListener;使用AppBundle\实体\产品;/ /为原则< 2.4:使用原则\ ORM \ \ LifecycleEventArgs事件;使用学说\持久性\事件\LifecycleEventArgs;SearchIndexer{公共函数postPersist(LifecycleEventArgs美元arg游戏){美元实体=美元arg游戏- >getObject ();/ /只作用于一些“产品”的实体如果(!美元实体运算符产品){返回;}美元entityManager=美元arg游戏- >getObjectManager ();/ /……做的产品}}

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

注意到一个重要的一点是将侦听一个侦听器所有在应用程序中实体。所以,如果你感兴趣只处理一种特定类型的实体(如产品实体而不是博客实体),您应该检查实体的类类型的方法(如上所示)。

提示

在教义2.4中,一个功能叫做实体听众。这是一个生命周期侦听器类用于一个实体。你可以读到它DoctrineBundle文档欧宝官网下载app

创建用户类

主义事件订阅者必须实现主义\ \ EventSubscriber接口和事件的方法对于每个事件订阅:

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
/ / src / AppBundle / EventListener / SearchIndexerSubscriber.php名称空间AppBundle\EventListener;使用AppBundle\实体\产品;使用学说\常见的\EventSubscriber;/ /为原则< 2.4:使用原则\ ORM \ \ LifecycleEventArgs事件;使用学说\ORM\事件;使用学说\持久性\事件\LifecycleEventArgs;SearchIndexerSubscriber实现了EventSubscriber{公共函数getSubscribedEvents(){返回(事件::postPersist、事件::postUpdate);}公共函数postUpdate(LifecycleEventArgs美元arg游戏){美元- >指数(美元arg游戏);}公共函数postPersist(LifecycleEventArgs美元arg游戏){美元- >指数(美元arg游戏);}公共函数指数(LifecycleEventArgs美元arg游戏){美元实体=美元arg游戏- >getObject ();/ /也许你只想作用于一些“产品”的实体如果(美元实体运算符产品){美元entityManager=美元arg游戏- >getObjectManager ();/ /……做的产品}}}

提示

主义事件订阅者不能返回一系列灵活的方法要求类似的事件ob娱乐下载Symfony事件订阅者可以。主义事件订阅者必须返回一个简单的数组他们订阅的事件名称。学说将期望订阅者的方法具有相同名称的每个订阅事件,当使用一个事件侦听器。

完整的参考,请参阅章节事件系统教义的文档。欧宝官网下载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,优先级:10}my.listener.with_low_priority:类:AppBundle \ EventListener \ MyLowPriorityListener标签:- - - - - -{名称:doctrine.event_listener,事件:postPersist,优先级:1}
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。