最近关于业务原因。要使用到TP6的事件,之前有个模糊的的概念。今天彻底的去看一下,按照官方文档来说
事件系统使用了观察者模式,提供了解耦应用的更好方式
首先的话需要生成一个事件类可以使用官方命令生成
php think make:event UserLogin
运行之后就命令会生成app\evect\UserLogin.php 文件,作为事件类
生成后还要bind去绑定一下事件类在app\evevt.php,官方说可以更简洁,我试了一下确实
[
//当你没有在这里绑定的时候,那么你在控制器进行事件触发就需要
//Event::trigger('UserLogin');
//但是如果你绑定了,那么就可以写成下面这样,控制器调用的时候可以写为
//Event::trigger('U');
//估计也就这样吧,具体的没去研究。
'U' => 'UserLogin',
],
'listen' => [
'AppInit' => [],
'HttpRun' => [],
'HttpEnd' => [],
'LogLevel' => [],
'LogWrite' => [],
],
'subscribe' => [
],
];
因为只是测试就不做相关的模型操作,只做基本的输出看一下流程,所以写了一个方法echo一下
app\evect\UserLogin.php
';
}
}
与此同时还要生成一个监听类,用来监听事件的业务逻辑,两者是相互结合的,用监听类来监听从而触发事件,以下命令会生成 app\listener\UserLogin 文件,作为监听类
php think make:listener UserLogin
创建后需要注册进行绑定,如果不绑定也可以进行动态注册,手动注册在控制器内写为
Event::listen('UserLogin','app\listener\UserLogin');
[
//当你没有在这里绑定的时候,那么你在控制器进行触发就需要
//Event::trigger('UserLogin');
//但是如果你绑定了,那么就可以写成下面这样,控制器调用的时候可以写为
//Event::trigger('U');
//估计也就这样吧,具体的没去研究。
'U' => 'UserLogin',
],
'listen' => [
'UserLogin' => app\listener\UserLogin,
'AppInit' => [],
'HttpRun' => [],
'HttpEnd' => [],
'LogLevel' => [],
'LogWrite' => [],
],
'subscribe' => [
],
];
在此也做一个简单的echo输出
index();
echo '已监听完成'.'';
}
}
再此就可以进行简单的测试了,创建一个控制器
接下来就是运行结果,这样就算完成了一个基本的事件类,可以根据你的业务需求进行调整
可是如果有多个事件就会很麻烦,需要生成多个监听类进行监听触发,所以还有一种方式
订阅类
接下来说一下我对订阅类的简单理解
订阅类是可以在一个监听类监听多个事件
还是命令行生成一个在app\subscribe\User文件
php think make:subscribe User
生成之后不要忘记去app\event.php 进行绑定
[
],
'listen' => [
'AppInit' => [],
'HttpRun' => [],
'HttpEnd' => [],
'LogLevel' => [],
'LogWrite' => [],
],
'subscribe' => [
'app\subscribe\User',
],
];
当然也可以使用动态注册
//动态注册
Event::subscribe('app\subscribe\User');
也是做简单的输出
listen('Index',[$this,'onIndex']);
$event->listen('Login',[$this,'onLogin']);
}
}
到这里订阅类就算是完成了,控制器调用订阅事件的时候使用以下方法
Event::trigger('Login');
运行结果为
订阅类相比于监听类和事件类来说会省事一些,以上就是我对事件,监听,订阅的理解,如果有理解的错误的地方,还望指点