Event事件

v1.0.2 版本
2022-06-16 版本更新时间
42 安装
3 star

简介

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::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::emit('user.register', $user);
    }
}

提示
Event::emit($event_name, $data);参数$data可以是任意的数据,例如数组、类实例、字符串等

通配符事件监听

通配注册监听允许您在同一个监听器上处理多个事件,例如

<?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 查看项目配置的所有事件及监听器