hehex/hehep-hevent

hehep-hevent 是一个PHP 用户事件组件,基本概念:事件,事件监听器,事件注解,事件管理器

v1.0.0 2024-08-20 02:07 UTC

This package is auto-updated.

Last update: 2025-04-29 01:29:44 UTC


README

介绍

  • hehep-hevent 是一个PHP 用户事件组件
  • 基本概念:事件,事件监听器,事件注解,事件管理器

安装

  • gitee下载:
git clone git@gitee.com:chinahehex/hehep-hevent.git
  • github下载:
git clone git@github.com:chinahehex/hehep-hevent.git
  • 命令安装:
composer require hehex/hehep-hevent

组件配置

$eventConf = [
    // 预定义"login"事件别名集合
    'alias'=>[
        // 定义名称为"login"事件
        'login'=>'admin\service\LoginEvent'
    ],
    
    // 预定义"login"事件监听器集合
    'listeners'=>[
        'login'=>[
            'admin\service\LoginEvent',// 创建LoginEvent新实例,并调用其handle
            'admin\service\LoginEvent@@addlog',// 调用LoginEvent 静态方法 addlog
            'admin\service\LoginEvent@setSession'// 创建LoginEvent新实例,并调用其setSession
        ]           
    ]
];

事件管理器

  • 说明
类名:hehe\core\hevent\EventManager
作用:预定义事件监听器,预定义事件别名,触发事件,获取事件对象,注解收集
  • 示例代码
use hehe\core\hevent\EventManager;

// 创建事件管理器
$hevent = new EventManager([]);

// 设置事件别名
$hevent->setAlias('login_event',LoginEvent::class);

// 创建事件对象
$event = $hevent->newEvent(LoginEvent::class);

// 绑定事件监听器
$hevent->listen(LoginEvent::class,LoginEventListener::class);

// 触发事件
$hevent->trigger(LoginEvent::class,['user'=>[]]);

事件

  • 说明
基类:hehe\core\hevent\base\Event,自定义事件必须继承此类
作用:存储事件数据,定义事件监听器集合
  • 定义事件
namespace apiadmin\behaviors;

use hehe\core\hevent\base\Event;

/**
 * 登录事件
 */
class LoginEvent extends Event
{   
    /**
    * @var User
     */
    public $user;
    
    // 定义事件的监听器集合
    protected $listeners = [
        LoginEventListener::class,
        LoginEventListener::class . '@@addlog',
        LoginEventListener::class . '@setSession'
    ];
    
    public function __construct(?User $user,array $propertys = [])
	{
	    $this->user = $user;
	    parent::__construct($propertys);
	}
}
  • 事件示例代码
use hehe\core\hevent\EventManager;
$hevent = new EventManager([]);

// 准备事件数据
$user = new User();

// 触发事件
$hevent->trigger(LoginEvent::class,['user'=>$user]);
  • 定义事件别名
use hehe\core\hevent\EventManager;
$hevent = new EventManager([]);

$hevent->setAlias('login_event',LoginEvent::class);

// 准备事件数据
$user = new User();

// 使用事件类触发事件方式1
$hevent->trigger(LoginEvent::class,['user'=>$user]);

// 使用别名触发事件方式2
$hevent->trigger('login_event',['user'=>$user]);
  • 获取事件对象
use hehe\core\hevent\EventManager;
use apiadmin\behaviors\LoginEvent;

$hevent = new EventManager([]);
// 默认Event事件类创建对象
$event = $hevent->newEvent();

// 指定事件类创建对象
$event = $hevent->newEvent(LoginEvent::class);

// 指定事件别名创建对象
$event = $hevent->newEvent('login_event');

// 触发事件
$hevent->trigger($event,['user'=>$user]);

事件监听器

  • 说明
类名:事件监听器可为任意类,可默认定义handle方法
  • 定义事件监听器
namespace apiadmin\behaviors;
use hehe\core\hevent\base\Event;
use apiadmin\behaviors\LoginEvent;
// 定义登录事件处理器
class LoginEventListener
{
    // 推送登录事件至队列,通知其他订阅系统
    public function handle(LoginEvent $event)
    {
        $user = $event->user;
    }

    // 添加登录日志
    public static function addlog(LoginEvent $event)
    {
        $user = $event->user;
    }

    // 设置会话
    public function setSession(Event $event)
    {
        $user = $event->user;
    }
}
  • 事件与监听器绑定
use hehe\core\hevent\EventManager;
$hevent = new EventManager([]);

// 事件类与监听器绑定
$hevent->listen(LoginEvent::class,LoginEventListener::class);
$hevent->listen(LoginEvent::class,LoginEventListener::class . '@@addlog');
$hevent->listen(LoginEvent::class,LoginEventListener::class . '@setSession');

// 事件别名与监听器绑定
$hevent->setAlias('login_event',LoginEvent::class);
$hevent->listen('login_event',LoginEventListener::class);
$hevent->listen('login_event',LoginEventListener::class . '@@addlog');
$hevent->listen('login_event',LoginEventListener::class . '@setSession');

触发事件

use hehe\core\hevent\EventManager;
$hevent = new EventManager([]);
// 绑定事件监听器
$hevent->listen(LoginEvent::class,LoginEventListener::class);

// 指定事件类触发事件
$hevent->trigger(LoginEvent::class,['user'=>$user]);

// 指定事件别名触发事件
$hevent->trigger(LoginEvent::class,['user'=>$user]);

// 事件对象触发事件
$event = $hevent->newEvent(LoginEvent::class);
$hevent->trigger($event,['user'=>$user]);

事件数据

  • 设置事件数据
// 事件数据
$user = new User();

// 创建事件对象时传递构造参数
$event = new LoginEvent($user);

// 创建事件对象时传递构造参数
$event = $hevent->newEvent(LoginEvent::class,$user);

// 通过setParams设置事件数据
$event = new LoginEvent();
$event->setParams(['user'=>$user,'logintime'=>date('Y-m-d H:i:s')]);

// 触发事件时提供参数
$hevent->trigger($event,['user'=>$user,'logintime'=>date('Y-m-d H:i:s')]);
  • 获取事件数据
use hehe\core\hevent\base\Event;
use apiadmin\behaviors\LoginEvent;
class LoginEventListener
{
    // 默认监听器方法
    public function handle(LoginEvent $event)
    {
        $user = $event->user;
    }

    // 添加登录日志
    public static function addlog(LoginEvent $event)
    {
        $user = $event->user;
    }

    // 设置会话
    public function setSession(Event $event)
    {
        // 获取事件属性数据
        $user = $event->user;
        
        // 获取事件非属性数据
        $logintime = $event->getParam('logintime');
        
        // 获取所有参数
        $params = $event->params;
    }
}

事件注解

  • 说明
事件注解类:hehe\core\hevent\annotation\AnnEvent
事件注解监听器类:hehe\core\hevent\annotation\AnnEventListener
事件注解处理器类:hehe\core\hevent\annotation\EventAnnotationProcessor
  • 注解事件类
namespace apiadmin\behaviors;

use hehe\core\hevent\base\Event;
use hehe\core\hevent\annotation\AnnEvent;

/**
 * 登录事件
 * @AnnEvent("user_login")
 */
class LoginEvent extends Event
{
    public $user;
}
  • 注解事件监听器
namespace admin\service;
use hehe\core\hevent\annotation\AnnEventListener;
use hehe\core\hevent\base\Event;

class LoginEventListener
{
    /**
     * 设置会话 
     * @AnnEventListener("user_login")
     * @param Event $event
     */
    public function handle(Event $event)
    {
        // 逻辑代码
    }

    /**
     * 添加登录日志 
     * @AnnEventListener("user_login")
     * @param Event $event
     */
    public static function addlog(Event $event)
    {
        // 逻辑代码
    }

    /**
     * 设置会话 
     * @AnnEventListener("user_login")
     * @param Event $event
     */
    public function setSession(Event $event)
    {
        // 逻辑代码
    }
}
  • 注解示例代码
use hehe\core\hevent\EventManager;
use apiadmin\behaviors\LoginEvent;
$hevent = new EventManager([]);
// 测试样例
$user = new User();

// 无需主动设置监听器
$this->hevent->trigger('user_login',['user'=>$user]);
$this->hevent->trigger(LoginEvent::class,['user'=>$user]);