mirror of
https://gitee.com/technical-laohu/mpay_v2_webman.git
synced 2026-04-23 10:34:25 +08:00
1. 调整异常处理类
2. 统一职责分工 3. 清除多余代码
This commit is contained in:
112
doc/event.md
Normal file
112
doc/event.md
Normal file
@@ -0,0 +1,112 @@
|
||||
event事件处理
|
||||
webman/event 提供一种精巧的事件机制,可实现在不侵入代码的情况下执行一些业务逻辑,实现业务模块之间的解耦。典型的场景如一个新用户注册成功时,只要发布一个自定义事件如user.register,各个模块遍能收到该事件执行相应的业务逻辑。
|
||||
|
||||
安装
|
||||
composer require webman/event
|
||||
|
||||
订阅事件
|
||||
订阅事件统一通过文件config/event.php来配置
|
||||
|
||||
<?php
|
||||
return [
|
||||
'user.register' => [
|
||||
[app\event\User::class, 'register'],
|
||||
// ...其它事件处理函数...
|
||||
],
|
||||
'user.logout' => [
|
||||
[app\event\User::class, 'logout'],
|
||||
// ...其它事件处理函数...
|
||||
]
|
||||
];
|
||||
说明:
|
||||
|
||||
user.register user.logout 等是事件名称,字符串类型,建议小写单词并以点(.)分割
|
||||
一个事件可以对应多个事件处理函数,调用顺序为配置的顺序
|
||||
事件处理函数
|
||||
事件处理函数可以是任意的类方法、函数、闭包函数等。
|
||||
例如创建事件处理类 app/event/User.php (目录不存在请自行创建)
|
||||
|
||||
<?php
|
||||
namespace app\event;
|
||||
class User
|
||||
{
|
||||
function register($user)
|
||||
{
|
||||
var_export($user);
|
||||
}
|
||||
|
||||
function logout($user)
|
||||
{
|
||||
var_export($user);
|
||||
}
|
||||
}
|
||||
发布事件
|
||||
使用 Event::dispatch($event_name, $data); 或 Event::emit($event_name, $data); 发布事件,例如
|
||||
|
||||
<?php
|
||||
namespace app\controller;
|
||||
use support\Request;
|
||||
use Webman\Event\Event;
|
||||
class User
|
||||
{
|
||||
public function register(Request $request)
|
||||
{
|
||||
$user = [
|
||||
'name' => 'webman',
|
||||
'age' => 2
|
||||
];
|
||||
Event::dispatch('user.register', $user);
|
||||
}
|
||||
}
|
||||
发布事件有两个函数,Event::dispatch($event_name, $data); 和 Event::emit($event_name, $data); 二者参数一样。
|
||||
区别是emit内部会自动捕获异常,也就是说如果一个事件有多个处理函数,某个处理函数发生异常不会影响其它处理函数的执行。
|
||||
而dispatch则内部不会自动捕获异常,当前事件的任何一个处理函数发生异常,则停止执行下一个处理函数并直接向上抛出异常。
|
||||
|
||||
提示
|
||||
参数$data可以是任意的数据,例如数组、类实例、字符串等
|
||||
|
||||
通配符事件监听
|
||||
通配符注册监听允许您在同一个监听器上处理多个事件,例如config/event.php里配置
|
||||
|
||||
<?php
|
||||
return [
|
||||
'user.*' => [
|
||||
[app\event\User::class, 'deal']
|
||||
],
|
||||
];
|
||||
我们可以通过事件处理函数第二个参数$event_data获得具体的事件名
|
||||
|
||||
<?php
|
||||
namespace app\event;
|
||||
class User
|
||||
{
|
||||
function deal($user, $event_name)
|
||||
{
|
||||
echo $event_name; // 具体的事件名,如 user.register user.logout 等
|
||||
var_export($user);
|
||||
}
|
||||
}
|
||||
停止事件广播
|
||||
当我们在事件处理函数里返回false时,该事件将停止广播
|
||||
|
||||
闭包函数处理事件
|
||||
事件处理函数可以是类方法,也可以是闭包函数例如
|
||||
|
||||
<?php
|
||||
return [
|
||||
'user.login' => [
|
||||
function($user){
|
||||
var_dump($user);
|
||||
}
|
||||
]
|
||||
];
|
||||
查看事件及监听器
|
||||
使用命令 php webman event:list 查看项目配置的所有事件及监听器
|
||||
|
||||
支持范围
|
||||
除了主项目基础插件和应用插件同样支持event.php配置。
|
||||
基础插件配置文件 config/plugin/插件厂商/插件名/event.php
|
||||
应用插件配置文件 plugin/插件名/config/event.php
|
||||
|
||||
注意事项
|
||||
event事件处理并不是异步的,event不适合处理慢业务,慢业务应该用消息队列处理
|
||||
Reference in New Issue
Block a user