怎么理解和更好的使用tp6事件系统

发布于 2019-12-03 16:25:04

thinkphp6的事件系统的定义

事件相比较中间件的优势是事件比中间件更加精准定位(或者说粒度更细),并且更适合一些业务场景的扩展。例如,我们通常会遇到用户注册或者登录后需要做一系列操作,通过事件系统可以做到不侵入原有代码完成登录的操作扩展,降低系统的耦合性的同时,也降低了BUG的可能性。

那么怎么理解和更好的使用tp6事件系统?

查看更多

浏览量
4004
2 个回答
猫哥
猫哥 项目组成员 2024-04-20
希望我的回答能对你有所帮助

事件基于观察者模式设计,所以首先我们要明确什么是观察者模式? 它有什么优势?

观察者模式

观察者模式是为了解决对象间一对多依赖关系的问题而设计的. 这里的一就是指主题,这里多就是指观察者, 当主题状态发生变化时,就会通知所有的观察者进行内部更新. 两个关键元素:

  1. 主题(object): 它负责维护多个观察者,提供注册/删除/通知观察者的功能;
  2. 观察者(observer): 它拥有一个更新的接口, 接收主题的通知并进行相应的更新;

观察者模式的优势: 主题只需要关心通知逻辑, 不关心观察者内部的具体实现, 实现解耦;

事件机制

再让我们回到thinkphp6的事件机制, 它拥有四个操作:

  1. 事件触发: Event::trigger('LoginAfter'), 参数是事件标识/事件类名称. 表示程序运行到这里将触发某个事件(比如:LoginAfter), 这里事件标识其实就是指上面提到的主题, trigger就是事件触发并通知观察者的操作.
  2. 事件绑定: Event::bind('LoginAfter','appeventLoginAfter'), 这个其实是对事件类起一个别名,所以更应该称之为"事件绑定别名"操作, 但这个类其实没啥用,所以这个绑定方法也没啥用,不知道官方咋想的,很迷.
  3. 事件监听: Event::listen('LoginAfter',$listener,$first),这个准确的讲应该是注册事件监听的函数,也就是上面的注册观察者, 第二个参数就是内部接收到通知的操作/监听执行类(默认执行handle方法), 也可以再event.php配置文件中优先配置. 同一个事件标识的地方可以添加多个监听者, 比如登录后可以变动积分/记录IP/通知粉丝等等;
  4. 事件订阅: Event::subscribe($subscriber), 再同一个功能单元(同一个文件)里同时注册多个不同监听器,比如一个用户订阅者类既注册监听用户登录事件还监听用户退出事件.

学习
记录

发布
问题

分享
好友

手机
浏览

扫码手机浏览