aesonus/events

该包的最新版本(v2.0-beta)没有可用的许可信息。

v2.0-beta 2018-07-20 06:02 UTC

This package is auto-updated.

Last update: 2024-09-29 05:42:29 UTC


README

Build Status

事件

简单的 Event,Listener 和 Dispatcher

测试

phpunit

如何使用

创建一个 dispatcher

$dispatcher = new Dispatcher();

扩展基本事件类以适应每个事件

class MyEvent extends Event { }

为每个事件和监听器实现监听器接口

class MyListener implements ListenerInterface {
    ...

在监听器中实现 handle 方法以执行特定任务

    ...
    public function handle(EventInterface $event): void { }
}

将监听器附加到事件队列中

$event = new MyEvent();

$event->attach(new MyListener());

您还可以为监听器分配优先级。默认优先级为 0。

$event->attach(new MyListener(), 3);

您可以使用数组附加多个监听器。

$listeners = [new MyListener(),new MyListener(),new MyListener()];
$event->attach($listeners);

每个附加的监听器都将分配给定的优先级

$listeners = [new MyListener(),new MyListener(),new MyListener()];

//They all get a priority of 3
$event->attach($listeners, 3);

请注意,如果所有监听器具有相同的优先级,则队列将从第一个附加的监听器(s)的第一个元素开始。考虑以下代码

$listenersA = [new MyListenerA(),new MyListenerB()];
$event->attach($listenersA);

$listenersB = [new MyListenerC(),new MyListenerD()];
$event->attach($listenersB);

当此事件分发时,第一个接收事件的监听器将是 MyListenerA。

您还可以通过传递带编号的数组来覆盖默认优先级,其中索引 0 是监听器,索引 1 是优先级

$listeners = [new MyListener(),[new MyListener(), 2],new MyListener()];

//They all get a priority of 3, except for the the listener at index 1
$event->attach($listeners, 3);

请注意,所有优先级都必须是整数。通过数组接口提供的不是整数的优先级将被设置为默认优先级。

使用 dispatcher 注册事件

$dispatcher->register($event);

使用类名分发事件。这将调用优先队列中每个监听器的 handle 方法。

$dispatcher->dispatch(MyEvent::class);

您也可以在不使用 dispatcher 的情况下分发事件

$event->dispatch();

可以通过异常中断分发队列,并从上次中断的地方继续。

try {
    $event->dispatch(); // This will throw an exception from one of the listeners
} catch (ResumableException $ex) {
    //do stuff to make all better
}

//Resume the dispatch
$event->dispatch();
...

分发队列也可以重置到 dispatch() 调用之前的状态

$event->reset();

重要的是要注意,恢复事件队列的执行将更改队列的缓存副本。谨慎使用可恢复性。