关于事件

事件介绍

插件使用的 webman/event 该插件提供一种精巧的事件机制,可实现在不侵入代码的情况下执行一些业务逻辑,实现业务模块之间的解耦。

举例三个示例场景如下:

场景1:一个新用户注册成功时,只要发布一个自定义事件如user.register,各个模块遍能收到该事件执行相应的业务逻辑。

场景2:一个用户购买商品时,需要发布一个自定义事件order.create,商品插件扣除库存,财务插件增加账单等等

🧨 订阅事件

插件订阅事件在插件目录app/event下新建事件处理文件,只要是符合事件类的文件,框架将自动加载

具体事件文件代码请阅读以下事件处理文档

💎 事件处理


<?php
namespace app\event;

/**
 * 用户相关事件
 * 类名必须结尾必须是Event
 * @copyright 贵州小白基地网络科技有限公司
 * @author 楚羽幽 cy958416459@qq.com
 */
class UserEvent
{
    /**
     * 用户注册事件处理
     * 生成事件名称:plugin.foo.user.register
     * @param array $data 外部传入参数
     * @return void
     * @copyright 贵州小白基地网络科技有限公司
     * @author 楚羽幽 cy958416459@qq.com
     */
    public function register(array $data)
    {
        print_r($data);
    }

    /**
     * 用户退出事件处理
     * 生成事件名称:plugin.foo.user.logout
     * @param array $data 外部传入参数
     * @return void
     * @copyright 贵州小白基地网络科技有限公司
     * @author 楚羽幽 cy958416459@qq.com
     */
    public function logout(array $data)
    {
        print_r($data);
    }
}

⚽ 发布事件


<?php
namespace app\controller;
use support\Request;
use Webman\Event\Event;

class User
{
    public function register(Request $request)
    {
        $user = [
            'name' => '小白基地',
            'url' => 'https://www.xiaobai.host'
        ];
        Event::dispatch('user.register', $user);
    }
}

请使用以下其中一种方式进行事件发布

Event::dispatch(eventname,eventname,data);


dispatch介绍:该事件内部事件的任何一个处理函数发生异常,则停止执行下一个处理函数并直接向上抛出异常。

Event::emit(eventname,eventname,data);


emit介绍:该事件自动捕获异常,也就是说如果一个事件有多个处理函数,某个处理函数发生异常不会影响其它处理函数的执行。

$event_name 事件名称
$data 事件参数
参数$data可以是任意的数据,例如数组、类实例、字符串等


🏓 事件监听

普通的事件监听,只需要在插件目录app/event下新建事件文件即可自动监听

如您需要通配符注册监听允许您在同一个监听器上处理多个事件,则需要另行配置

💊 停止事件

当我们在事件处理函数里返回false时,该事件将停止广播

⏰ 查看事件

使用命令 php webman event:list 查看项目配置的所有事件及监听器(包括框架事件)

🔔注意事项

event事件处理并不是异步的,event不适合处理慢业务,慢业务应该用消息队列处理,点击查看插件消息队列文档