weew/eventer

简单的事件系统。

v2.2.2 2016-07-21 11:17 UTC

This package is not auto-updated.

Last update: 2024-09-14 19:36:41 UTC


README

Build Status Code Quality Test Coverage Version Licence

目录

安装

composer install weew/eventer

使用

此事件系统允许您轻松订阅特定事件,并在事件发生时立即收到通知。订阅事件的简单方法是用字符串作为事件名称。

简单订阅

创建订阅的最简单方法是使用回调函数。

$eventer = new Eventer();
$eventer->subscribe('event.name', function(IEvent $event) {
    echo $event->getName();
    // event.name
});
$eventer->dispatch('event.name');

将数据附加到事件

通常,您可能想要附加特定数据来抛出事件。实现此目的的最快方法是使用通用事件。

$eventer = new Eventer();
$eventer->subscribe('event.name', function(IEvent $event) {
    var_dump($event->getData());
    // ['secret' => 'secret value']
    echo $event->get('secret');
    // secret value
});

$event = new GenericEvent('event.name', ['secret' => 'secret value']);
// or
$event = new GenericEvent('event.name');
$event->set('secret', 'secret value');

$eventer->dispatch($event);

创建自定义事件

在更复杂的应用程序中,我建议您自己创建事件。这使代码更容易理解,因为您永远不必猜测事件名称可能是什么。它还允许您通过更复杂的行为扩展事件。

class CustomEvent extends Event {
    public function getSecret() {
        return 'secret value';
    }
}

$eventer = new Eventer();
$eventer->subscribe(CustomEvent::class, function(CustomEvent $event) {
    echo $event->getSecret();
    // secret value
});

$eventer->dispatch(new CustomEvent());

取消事件订阅

要取消事件订阅,您可以简单地将订阅对象传递给事件分发器的取消订阅方法。

$eventer = new Eventer();
$subscription = $eventer->subscribe('event.name', 'abstract.value');
$eventer->unsubscribe($subscription);

事件订阅者

在事件中使用回调可能并不总是最佳解决方案。因此,您可以创建在事件发生时被调用的事件订阅者类。该类必须具有 handle(IEvent $event) 方法,但没有强制您实现的特定接口。

class CustomEvent extends Event {
    public function getSecret() {
        return 'secret value';
    }
}

class CustomEventSubscriber {
    public function handle(IEvent $event) {
        /** @var CustomEvent $event */
        echo $event->getSecret();
        // secret value
    }
}

$eventer = new Eventer();
$eventer->subscribe(CustomEvent::class, CustomEventSubscriber::class);
$eventer->dispatch(new CustomEvent());

现有容器集成

存在针对 weew/container 的集成。请参阅 eventer-container-aware