事件监听

优质
小牛编辑
142浏览
2023-12-01

全局事件

事件监听

注解监听

imi/src/Listener/Init.php为例

<?php
namespace Imi\Listener;

use Imi\Event\EventParam;
use Imi\Event\IEventListener;
use Imi\Bean\Annotation\Listener;

/**
 * @Listener(eventName="IMI.INITED",priority=PHP_INT_MAX)
 */
class Init implements IEventListener
{
    /**
     * 事件处理方法
     * @param EventParam $e
     * @return void
     */
    public function handle(EventParam $e)
    {
        // ...
    }
}

首先需要定义一个类,类名和位置无所谓,只要配置了beanScan能被扫描到即可。

类必须实现IEventListener接口和public function handle(EventParam $e)方法。

然后在类上写@Listener注解。注解有两个参数:

eventName要监听的事件名称 priority事件触发后执行的优先级,数字越大越先执行,同样大执行顺序不一定

代码监听

除了使用注解,你还可以写代码手动监听

use Imi\Event\Event;

Event::on('事件名', function(){
    // 事件回调
});

$priority = 0;
Event::on('事件名', function(){
    // 事件回调
}, $priority);

// 监听只触发一次
Event::one('事件名', function(){});

// 取消事件
Event::off('事件名', $callable);

on()、one()、off() 方法还支持传入多个事件:

Event::on(['e1', 'e2'], function(){
    // 事件回调
});

取消事件所有监听:

Event::off('事件名');
Event::off(['事件名1', '事件名2']);

自定义事件

use Imi\Event\Event;

Event::trigger('事件名称', '传入事件回调的数据', '目标对象', '参数类,默认为EventParam::class');

局部事件

局部事件就是在某个类实例的事件。

事件监听

注解监听

imi/src/Server/Http/Listener/BeforeRequest.php为例

<?php
namespace Imi\Server\Http\Listener;

use Imi\Bean\Annotation\ClassEventListener;
use Imi\Server\Event\Param\RequestEventParam;
use Imi\Server\Event\Listener\IRequestEventListener;

/**
 * request事件前置处理
 * @ClassEventListener(className="Imi\Server\Http\Server",eventName="request",priority=PHP_INT_MAX)
 */
class BeforeRequest implements IRequestEventListener
{
    /**
     * 事件处理方法
     * @param RequestEventParam $e
     * @return void
     */
    public function handle(RequestEventParam $e)
    {
        // ...
    }
}

首先需要定义一个类,类名和位置无所谓,只要配置了beanScan能被扫描到即可。

类必须实现对应接口和handle()方法,每个类的事件定义不同。

然后在类上写@ClassEventListener注解。注解参数如下:

className类名 eventName要监听的事件名称 priority事件触发后执行的优先级,数字越大越先执行,同样大执行顺序不一定

代码监听

$object->on('事件名', function(){
    // 事件回调
});

$priority = 0;
$object->on('事件名', function(){
    // 事件回调
}, $priority);

// 监听只触发一次
$object->one('事件名', function(){});

// 取消事件
$object->off('事件名', $callable);

自定义事件

$object->trigger('事件名称', '传入事件回调的数据', '目标对象', '参数类,默认为EventParam::class');