官方定义: 新版的事件系统可以看成是5.1版本行为系统的升级版,事件系统相比行为系统强大的地方在于事件本身可以是一个类,并且可以更好的支持事件订阅者。
事件相比较中间件的优势是事件比中间件更加精准定位(或者说粒度更细),并且更适合一些业务场景的扩展。例如,我们通常会遇到用户注册或者登录后需要做一系列操作,通过事件系统可以做到不侵入原有代码完成登录的操作扩展,降低系统的耦合性的同时,也降低了BUG的可能性。
官方文档东扯一句西扯一句,看到云里雾里完全不知道该怎么用,下面整理下网上查找到的事件用法资料
1、定义事件|自定义事件
事件可以单独写一个事件类,也可以监听的时候写匿名函数(匿名函数归到使用处再介绍)
# 命令行生成事件类
php think make:listener TestListener
编辑handle函数
<?php
declare (strict_types = 1);
namespace app\listener;
class TestListener
{
/**
* 事件监听处理
*
* @return mixed
*/
public function handle($event)
{
echo "这里是app/listener/testListener的handle<br />".PHP_EOL;
}
}
2、控制器中使用
<?php
namespace app\index\controller;
use think\Facade\Event;
class Test
{
public function myListen()
{
// 匿名函数(这里是案例说明,一般匿名函数使用会写在base或initialize里供更多action使用)
Event::listen('anonymous', function($param){
echo '我是匿名函数事件,下面是我的参数param:';
dump($param);
});
Event::trigger('anonymous','我是参数param'); // 使用Event的trigger触发事件
// 类的使用(另外事件类除了Event::listen手动开启监听外,还可以修改event.php文件,添加事件监听)
Event::listen('test', 'app\listener\TestListener');
event('test'); // 使用助手函数触发事件
return 'hello world!';
}
}
3、修改event.php注册监听类
最终结果:
4、事件订阅
可以通过事件订阅机制,在一个监听器中监听多个事件
监听事件的方法命名规范是on+事件标识(驼峰命名),如果希望统一添加事件前缀标识,可以定义eventPrefix属性。
首先我们通过命令行生成一个订阅类 TestSub.php
<?php
declare (strict_types = 1);
namespace app\subscribe;
class TestSub
{
protected $eventPrefix = 'User';
public function onLogin($user)
{
// UserLogin事件响应处理
echo '登录处理';
}
public function onLogout($user)
{
// UserLogout事件响应处理
echo '退出处理';
}
public function subscribe(Event $event)
{
$event->listen('UserLogin', [$this,'onUserLogin']);
$event->listen('UserLogout',[$this,'onUserLogout']);
}
}
控制器调用
<?php
namespace app\controller;
use think\facade\Event;
class Index
{
public function index()
{
// event('UserLogin'); // 订阅也可以单独事件使用
// event('UserLogout');
Event::subscribe('app\subscribe\User'); // 订阅事件同时处理
return 'hello world!';
}
}