Files
mpay_v2_webman/doc/event.md
技术老胡 d5a134d3a8 1. 调整异常处理类
2. 统一职责分工
3. 清除多余代码
2026-02-24 13:37:35 +08:00

3.4 KiB
Raw Permalink Blame History

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不适合处理慢业务慢业务应该用消息队列处理