事件
- 事件和中间件有一点相似,只不过事件更加的精准定位更细腻的业务场景;
- 事件可定义:事件类、事件监听类、事件订阅类; 3. 我们先创建一个测试事件的类:TestEvent.php,手动创建一个测试类;
public function __construct()
{
Event::listen('TestListen',function ($a){
echo '监听器被处罚'.$a;
});
}
public function info(){
echo '登录前准备!';
// Event::trigger('TestListen','ok');
// Event::listen('abc',TestListen::class);
// Event::trigger('abc','hdhdh');
event('TestListen','测试233');
}
- 我们也可以使用监听类来设计监听器,使用命令行创建;
php think make:listener TestListen
public function info(){
echo '登录前准备!';
// Event::trigger('TestListen','ok');
Event::listen('abc',TestListen::class);
// Event::trigger('abc','hdhdh');
event('abc','滚吧');
}
- 在 app/event.php 中,listen 是配置监听类的,配置方式如下:
<?php
// 事件定义文件
return [
'bind' => [
],
'listen' => [
'AppInit' => [],
'HttpRun' => [],
'HttpEnd' => [],
'LogLevel' => [],
'LogWrite' => [],
'TestListen'=>[\app\listener\TestListen::class]
],
'subscribe' => [
],
];
- 而监听类被触发会自动执行 handle()方法,实现监听功能;
<?php
declare (strict_types = 1);
namespace app\listener;
class TestListen
{
/**
* 事件监听处理
*
* @return mixed
*/
public function handle($event)
{
echo '1111我是监听器哈哈哈哈!!!!'.$event;
}
}
- 系统还内置了系统触发的事件,只要满足条件就会自动触发;
8.事件监听类,可以同时监听多个监听类,只要绑定到一个标识符即可;
TestListen' => [
\app\listener\TestListen::class,
\app\listener\TestOne::class,
\app\listener\TestTwo::class
]
9.对于需要多个监听,监听类不够灵活,而且类会创建很多,可以使用订阅类;
10.订阅类就是将监听事件作为内部的方法用 on+方法名来实现;
php think make:subscribe UserSub
<?php
declare (strict_types = 1);
namespace app\subscribe;
class UserSub
{
public function onUserLogin(){
echo '登录监听';
}
public function onUserLogout(){
echo '+退出监听';
}
}
11.然后,我们直接去 app/event.php 注册一下;
<?php
// 事件定义文件
return [
'bind' => [
],
'listen' => [
'AppInit' => [],
'HttpRun' => [],
'HttpEnd' => [],
'LogLevel' => [],
'LogWrite' => [],
'TestListen'=>[\app\listener\TestListen::class]
],
'subscribe' => [
'UserSub'=> \app\subscribe\UserSub::class
],
];
12.然后,两个方法分别监听两个事件方法,直接调用方法名即可;
<?php
declare (strict_types = 1);
namespace app\controller;
use app\listener\TestListen;
use think\facade\Event;
class TestEvent
{
public function __construct()
{
/*Event::listen('TestListen',function ($a){
echo '监听器被处罚'.$a;
});*/
}
public function info(){
echo '登录前准备!';
// Event::trigger('TestListen','ok');
// Event::listen('abc',TestListen::class);
// Event::trigger('abc','hdhdh');
event('TestListen','滚吧');
}
public function login(){
event('UserLogin'); //订阅类
}
public function logout(){
event('UserLogout'); //订阅类
}
}
13.对于事件类,很少有场景需要使用它,毕竟系统提供的各种精确方案较多;
php think make:event UserEvent
class UserEvent
{
public function construct()
{
echo '我是事件类!';
}
}
Event::trigger(new UserEvent());