/快递

最小化事件系统

0.1 2021-09-12 13:46 UTC

This package is auto-updated.

Last update: 2024-09-16 19:17:13 UTC


README

Kurir(瑞典快递)是一个用于PHP的最小化事件系统。使用Kurir,您可以订阅自定义类型的事件。

用法

final class MyEvent implements Event
{
    private $message;

    public function __construct(string $message)
    {
        $this->message = $message;
    }

    public function getMessage(): string
    {
        return $this->message;
    }
}

$kurir = new Kurir();

$kurir->subscribe(function (MyEvent $event) {
   echo $event->getMessage();
});

$kurir->emit(new MyEvent('Hello, World!'));

安装

composer require paket/kurir

需求

需要PHP 7.1或更高版本。

通用

核心接口

Kurir由三个接口组成,即EventEventSourceEventEmitter,其中类Kurir实现了EventSourceEventEmitter

事件

interface Event
{
}

Event是所有事件的通用类型,但它不提供任何方法,每个事件实现都可根据需要添加方法或属性。

EventSource

interface EventSource
{
    public function subscribe(callable $listener): callable;

    public function unsubscribe(callable $listener): void;
}

监听器可以通过使用EventSource来订阅和取消订阅事件。subsribe()返回与传递给它的参数相同的可调用对象,这有助于在取消订阅时使用。

$listener = $eventSource->subscribe(function (MyEvent $event) {
   echo $event->getMessage();
});

$eventSource->unsubscribe($listener);

EventEmitter

interface EventEmitter
{
   public function emit(Event $event): void;
}

用于向该事件类型的每个订阅者发出一个类型为Event的事件。

示例

通过将EventSourceEventEmitter分离为两个不同的接口,您只需要在程序代码中公开一个或另一个,例如,假设我们有一个保存记录的存储库,并希望记录日志。

final class InsertedRecordEvent implements Event
{
    private $id;
    private $record;

    public function __construct(int $id, array $record)
    {
        $this->id = $id;
        $this->record = $record;
    }

    public function getId(): int
    {
        return $this->id;
    }

    public function getRecord(): array
    {
        return $this->record;
    }
}

interface Storage
{
    public function insert(string $location, array $record): int;
}

final class RecordRepository
{
    private $storage;
    private $eventEmitter;

    public function __construct(Storage $storage, EventEmitter $eventEmitter)
    {
        $this->storage = $storage;
        $this->eventEmitter = $eventEmitter;
    }

    public function insertRecord(array $record)
    {
        $id = $this->storage->insert('record', $record);
        $this->eventEmitter->emit(new InsertedRecordEvent($id, $record));
    }
}

final class RecordLog
{
    private $eventSource;
    private $listener;

    public function __construct(EventSource $eventSource)
    {
        $this->eventSource = $eventSource;
        $this->listener = $this->eventSource->subscribe(function (InsertedRecordEvent $event) {
            echo "Inserted record {$event->getId()}";
        });
    }

    public function __destruct()
    {
        $this->eventSource->unsubscribe($this->listener);
    }
}


$kurir = new Kurir();
$repository = new RecordRepository($storage, $kurir);
$log = new RecordLog($kurir);
$repository->insertRecord(['action' => 'login', 'user' => 'joe', 'time' => 1631375296]);

许可

Kurir遵循MIT许可发布。请参阅捆绑的文件LICENSE.txt。