最近关于业务原因。要使用到TP6的事件,之前有个模糊的的概念。今天彻底的去看一下,按照官方文档来说

定义事件

事件系统使用了观察者模式,提供了解耦应用的更好方式

首先的话需要生成一个事件类可以使用官方命令生成

php think make:event UserLogin

运行之后就命令会生成app\evect\UserLogin.php 文件,作为事件类

生成后还要bind去绑定一下事件类在app\evevt.php,官方说可以更简洁,我试了一下确实

<?php
// 事件定义文件
return ['bind'      => [//当你没有在这里绑定的时候,那么你在控制器进行事件触发就需要//Event::trigger('UserLogin');  //但是如果你绑定了,那么就可以写成下面这样,控制器调用的时候可以写为//Event::trigger('U');//估计也就这样吧,具体的没去研究。'U' => 'UserLogin',],'listen'    => ['AppInit'  => [],'HttpRun'  => [],'HttpEnd'  => [],'LogLevel' => [],'LogWrite' => [],],'subscribe' => [],
];

因为只是测试就不做相关的模型操作,只做基本的输出看一下流程,所以写了一个方法echo一下

app\evect\UserLogin.php

<?php
declare (strict_types = 1);namespace app\event;class UserLogin
{public function index(){return '这里是事件类'.'<br/>';}
}

与此同时还要生成一个监听类,用来监听事件的业务逻辑,两者是相互结合的,用监听类来监听从而触发事件,以下命令会生成 app\listener\UserLogin 文件,作为监听类

php think make:listener UserLogin

创建后需要注册进行绑定,如果不绑定也可以进行动态注册,手动注册在控制器内写为

Event::listen('UserLogin','app\listener\UserLogin');
<?php
// 事件定义文件
return ['bind'      => [//当你没有在这里绑定的时候,那么你在控制器进行触发就需要//Event::trigger('UserLogin');  //但是如果你绑定了,那么就可以写成下面这样,控制器调用的时候可以写为//Event::trigger('U');//估计也就这样吧,具体的没去研究。'U' => 'UserLogin',],'listen'    => ['UserLogin' => app\listener\UserLogin,'AppInit'  => [],'HttpRun'  => [],'HttpEnd'  => [],'LogLevel' => [],'LogWrite' => [],],'subscribe' => [],
];

在此也做一个简单的echo输出

<?php
declare (strict_types = 1);namespace app\listener;class UserLogin
{/*** 事件监听处理** @return mixed*///方法的参数是你的事件类public function handle(\app\event\UserLogin $event){//输出事件类echo $event->index();echo '已监听完成'.'</br>';}
}

再此就可以进行简单的测试了,创建一个控制器

<?php
namespace app\controller;use app\BaseController;use think\facade\Event;class Index extends BaseController
{public function test(){//下面这句话是手动注册,如过没有在 app\event.php进行绑定就需要手动注册//因为我已经绑定了所以就没有使用这种方式//Event::listen('UserLogin','app\listener\UserLogin');//触发事件类 也可以通过助手函数 event('U')触发//trigger方法是可以传递参数参数的Event::trigger('U');echo '运行完成';}
}

接下来就是运行结果,这样就算完成了一个基本的事件类,可以根据你的业务需求进行调整

可是如果有多个事件就会很麻烦,需要生成多个监听类进行监听触发,所以还有一种方式

订阅类

接下来说一下我对订阅类的简单理解

订阅类是可以在一个监听类监听多个事件

还是命令行生成一个在app\subscribe\User文件

php think make:subscribe User

生成之后不要忘记去app\event.php 进行绑定

<?php
// 事件定义文件
return ['bind'      => [],'listen'    => ['AppInit'  => [],'HttpRun'  => [],'HttpEnd'  => [],'LogLevel' => [],'LogWrite' => [],],'subscribe' => ['app\subscribe\User',],
];

当然也可以使用动态注册

//动态注册
Event::subscribe('app\subscribe\User');

也是做简单的输出

<?php
declare (strict_types = 1);namespace app\subscribe;use think\Event;class User
{//监听事件的方法命名规范是on+事件标识(驼峰命名),//如果希望统一添加事件前缀标识,可以定义eventPrefix属性。//protected $eventPrefix = 'User';public function onIndex(){echo 'index';}public function onLogin(){echo 'login';}//如果希望自定义订阅方式(或者方法规范),可以定义subscribe方法实现。//这个和上面eventPrefix是有冲突的,只能选择一个来使用,我选择的是自定义public function subscribe(Event $event){$event->listen('Index',[$this,'onIndex']);$event->listen('Login',[$this,'onLogin']);}
}

到这里订阅类就算是完成了,控制器调用订阅事件的时候使用以下方法

Event::trigger('Login');

运行结果为

订阅类相比于监听类和事件类来说会省事一些,以上就是我对事件,监听,订阅的理解,如果有理解的错误的地方,还望指点

关于TP6的 事件,监听,订阅 理解相关推荐

  1. 事件监听的理解(ActionListener等)

    Java事件监听机制在GUI应用的比较多.我们会时常对界面进行一系列的操作,如文本框输入.添加删除按钮等等.当进行这些操作时,程序就会采取相应措施相应这些事件. 一. 事件监听有三部分组成:事件源,事 ...

  2. android 判断按钮是否已经有onclicklinstener,通过点击事件监听setOnClickListener彻底理解回调...

    前言 老司机们对于回调肯定熟悉得不能再熟悉了,但是新司机可能还是一脸懵逼的,我比较笨,当年懵逼了好久,看夏安明的这一篇博客地址,虽然下边的留言都是,写得好!懂了懂了!但是我当时看了三遍还是不懂好吗 - ...

  3. 发布订阅模式 仿写Vue事件监听手写js实现

    Vue组件中,可以使用 $emit,$on,$off 分别来分发.监听.取消监听事件实现组件通信,比较方便: 最近空闲时间手撸代码实现了发布订阅模式,可以进行组件通信. 话不多说,直接上代码 /*** ...

  4. 通过点击事件监听 setOnClickListener 彻底理解回调-Android

    前言 老司机们对于回调肯定熟悉得不能再熟悉了,但是新司机可能还是一脸懵逼的,我比较笨,当年懵逼了好久,看夏安明的这一篇博客地址,虽然下边的留言都是,写得好!懂了懂了!但是我当时看了三遍还是不懂好吗 - ...

  5. 《深入理解OSGi:Equinox原理、应用与最佳实践》一3.4 事件监听

    3.4 事件监听 事件监听在OSGi中是一种很常见的设计模式,在Bundle生命周期的不同状态相互转换时,OSGi框架会发布出各种不同的事件供事先注册好的事件监听器处理,这些事件被称为"生命 ...

  6. 由c#事件监听、回调函数引发观察者模式

    由c#事件监听.回调函数引发观察者模式 事件监听: C#中的事件,可以简单的理解为类或者对象发生了一件事,并且把这件事通知给了其他的类或者对象,其他的类或者对象可以根据事件的消息有所反应. 这非常类似 ...

  7. 【方案篇】事件监听函数的内存泄漏,帮你搞定!不谢!!!

    本文是 理论篇 ,还有下篇 代码篇. 前言 工作中,我们会对window, DOM节点,WebSoket, 或者单纯的事件中心等注册事件监听函数. // window window.addEventL ...

  8. 关于事件监听机制的总结(Listener和Adapter)

    记得以前看过事件监听机制背后也是有一种设计模式的.(设计模式的名字记不清了,只记得背后实现的数据结构是数组.) 附上事件监听机制的分析图: 一个事件源可以承载多个事件(只要这个事件源支持这个事件就可以 ...

  9. chromedp网络监听_动态爬虫三:监听网络事件 + 监听js事件

    一: 概述 上两篇文章介绍了cdp协议和chromedp库,从这篇文章开始动手实战一下,我们要拿到页面上更多的网络请求,最直接的想法就是类似于开发者工具里的network,只有一有网络请求就显示在列表 ...

  10. Ⅵ:zookeeper的Watcher事件监听机制

    2021最新zookeeper系列 ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤ ...

最新文章

  1. java 挂钩子_挂钩组件
  2. oci连接mysql_使用 OCILIB 连接并操作 Oracle 数据库
  3. python中的repr是什么意思_python中str和repr有什么区别
  4. JQuery LazyLoad实现图片延迟加载-探究
  5. windows查看进程
  6. 亚信安全特邀出席2016首届国际反病毒大会
  7. 电脑怎么开护眼模式_心累!整天对着手机电脑,到底该怎么护眼啊啊啊
  8. 基于Unity的阿里云短信SDK接入流程
  9. 常见电容器图片_电容的电路符号及图片识别
  10. 花瓣网 html,css+html如何仿花瓣网实现静态登陆页面?(代码实
  11. 网易免费企业邮箱MX验证,如何通过验证?(阿里云域名篇)。
  12. 三极管(如NPN)集电极正偏 发射极反偏会怎么样呢? 电流会倒流吗? 其他三种都知道,就是不知道这种情况...
  13. 这些年来什么才是最好的投资?
  14. 关于龙勃透镜天线,看这一篇就够了!
  15. HTML——阿里百秀案例
  16. iis怎么安装php,IIS下如何安装php扩展
  17. 如何本地安装微擎系统
  18. 课程表里的表表机器人_乐高机器人初级课程表
  19. 下列不属于php技术的优点是,下列各项不属于短信息技术特点的有()。A.技术成熟B.成本高昂C.实时性好D.反映快E.使用频繁...
  20. DIY便携式肖像绘图机

热门文章

  1. 不良资产处置对上市银行经营有何影响?
  2. 傅里叶变换F(w)和F(f)之间的转换(有问题,但是目前我不会改了)
  3. LeetCode / Scala - 无重复字符最长子串 ,最长回文子串
  4. Apache如何配置域名
  5. 咖啡汪笔记 —— 微服务架构下如何保证事务的一致性(InfoQ公开课)
  6. iText中使用虚线(表格边框或其他)
  7. 视频教程-Hyper-V 2012 R2虚拟化实战-Windows
  8. 数据库类型与Java类型对照表
  9. 【英语语法】 either or / neither nor
  10. 如何在Photoshop中修复红眼