包 / 快递
最小化事件系统
0.1
2021-09-12 13:46 UTC
Requires
- php: >=7.1
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由三个接口组成,即Event
、EventSource
和EventEmitter
,其中类Kurir
实现了EventSource
和EventEmitter
。
事件
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
的事件。
示例
通过将EventSource
和EventEmitter
分离为两个不同的接口,您只需要在程序代码中公开一个或另一个,例如,假设我们有一个保存记录的存储库,并希望记录日志。
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。