aesonus / events
该包的最新版本(v2.0-beta)没有可用的许可信息。
v2.0-beta
2018-07-20 06:02 UTC
Requires
- php: >=7.1
- aesonus/paladin: ^2
Requires (Dev)
- aesonus/test-lib: ^2.0
This package is auto-updated.
Last update: 2024-09-29 05:42:29 UTC
README
事件
简单的 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();
重要的是要注意,恢复事件队列的执行将更改队列的缓存副本。谨慎使用可恢复性。