constanze-standard/event-dispatcher
Composer 安装命令:
composer require constanze-standard/event-dispatcher
包简介
An event dispatching system with PSR-14.
README 文档
README
PSR-14 事件派发与监听系统。
An event dispatching system with PSR-14.
简介
event-dispatcher 是一个事件派发系统。它派发一个事件,并以优先级顺序调用预先定义的事件处理程序。
事件系统由以下5个概念构成:
- 事件 (Event): Event 是事件信息的载体,它往往围绕一个动作进行描述,例如 “用户被创建了”、“准备导出 excel 文件” 等等,Event 的内部需要包含当前事件的所有信息,以便后续的处理程序使用。
- 监听器 (Listener): Listener 是事件处理程序,负责在发生某一事件(Event)时执行特定的操作。
- Listener Provider: 它负责将事件(Event)与监听器(Listener)进行关联,在触发一个事件时,Listener Provider 需要提供绑定在该事件上的所有监听器。
- 派发器 (EventDispatcher): 负责通知某一事件发生了。我们所说的“向某一目标派发一个事件”,这里的“目标”指的是 Listener Provider,也就是说,EventDispatcher 向 Listener Provider 派发了 Event。
- 订阅器 (Subscriber): 订阅器是 Listener Provider 的扩展,它可以将不同的事件和订阅器里的方法进行自由绑定,这些操作都在订阅器内部进行,这样可以将同类事件的绑定与处理内聚,便于管理。
安装
composer require constanze-standard/event-dispatcher
使用
创建 Event
use ConstanzeStandard\EventDispatcher\Event; $event = new Event(); echo $event->getName(); // \ConstanzeStandard\EventDispatcher\Event
\ConstanzeStandard\EventDispatcher\Event 基于 \ConstanzeStandard\EventDispatcher\Interfaces\EventInterface,并实现了StoppableEventInterface。
\ConstanzeStandard\EventDispatcher\Interfaces\EventInterface::getName 方法返回当前事件的唯一标识,默认为类名称。
定制的 CustomEvent:
use ConstanzeStandard\EventDispatcher\Event; class CustomEvent extends Event { private $id; private $data; public function __construct($id, $data) { $this->id = $id; $this->data = $data; } public function getName() { return $id; } } $event = new CustomEvent('user.create', ['id' => 1, 'name' => 'Alex']);
如果你的事件需要在网络间传输,你可能还需要实现 Serializable 接口,以便将有用的信息序列化:
use ConstanzeStandard\EventDispatcher\Event; class CustomEvent extends Event implements \Serializable { ... public function serialize() { return serialize([ 'name' => $this->name, 'data' => $this->data ]); } public function unserialize($serialized) { $array = unserialize($serialized); $this->name = $array['name']; $this->data = $array['data']; } } $event = new CustomEvent('user.create', ['id' => 1, 'name' => 'Alex']); $decompEvent = unserialize(serialize($event));
定义 Listener
Listener 可以是任意可调用对象,或任意对象的方法,它可以接受一个 \ConstanzeStandard\EventDispatcher\Interfaces\EventInterface 的实例作为唯一参数,Listener 必须返回传入的 event 相同类型的实例对象:
use ConstanzeStandard\EventDispatcher\Interfaces\EventInterface; // 可调用对象 function onSomeEvent(EventInterface $event) { echo $event->getName(); return $event; } class Listener { // 普通的类方法 public function onSomeEvent(EventInterface $event) { echo $event->getName(); return $event; } }
\ConstanzeStandard\EventDispatcher\Event::withPropagationStopped 将返回一个与当前 event 对象相同,但携带了终止信号的 event,如果将它作为返回值,将终止后续的 event 派发。
use ConstanzeStandard\EventDispatcher\Interfaces\EventInterface; function onSomeEvent(EventInterface $event) { return $event->withPropagationStopped(); }
定义 Listener Provider
Listener Provider 负责确定哪些 listener 与当前派发的事件相关,并将相关的 listener 提供给 dispatcher. 添加一个 Listener:
use ConstanzeStandard\EventDispatcher\ListenerProvider; $listenerProvider = new ListenerProvider(); $listenerProvider->addListener('user.create', onSomeEvent::class, 2); $listenerProvider->addListener('user.create', [new Listener(), 'onSomeEvent'], 10);
如上所示,通过 ConstanzeStandard\EventDispatcher\ListenerProvider::addListener 方法绑定关系,第一个参数是事件 id;第二个参数是监听器对象,可以直接传入可调用对象,或形如 [对象, 方法名称] 的数组;第三个参数是优先级,必须为数字,数字越大优先级越高(越先调用),默认优先级为 0。
事件派发
ConstanzeStandard\EventDispatcher\EventDispatcher 在初始化时绑定一个 Listener Provider 实例,然后可以调用 EventDispatcher::dispatch 方法将事件发送给 Listener Provider:
use ConstanzeStandard\EventDispatcher\EventDispatcher; use Psr\EventDispatcher\ListenerProviderInterface; /** @var ListenerProviderInterface $listenerProvider */ $dispatcher = new EventDispatcher($listenerProvider); $dispatcher->dispatch($event);
上例会直接触发 $event 事件,并且按优先级调用 $listenerProvider 中绑定到该事件上的所有监听器。
使用订阅器
我们之前利用 ListenerProvider::addListener 添加事件和监听器的关系,这种方式比较过程化,也无法体现出一组事件之间的关系,所以在实践中往往会提出“订阅器”的概念。
订阅器(Subscriber)实际上是对 ListenerProvider::addListener 的一种装饰。使用订阅器需要实现 ConstanzeStandard\EventDispatcher\Interfaces\SubscriberInterface 接口:
use ConstanzeStandard\EventDispatcher\Interfaces\EventInterface; use ConstanzeStandard\EventDispatcher\Interfaces\SubscriberInterface; class UserSubscriber implements SubscriberInterface { public function subscribe(Closure $subscriber) { $subscriber( 'user.signup', 'onSignup', ['onCreate', 1] ); } public function onSignup(EventInterface $event) { ... return $event; } public function onCreate(EventInterface $event) { ... return $event; } } $listenerProvider->addSubscriber(new UserSubscriber());
ConstanzeStandard\EventDispatcher\Interfaces\SubscriberInterface::subscribe 方法会提供一个订阅器闭包函数,这个函数的第一个参数是事件 id,后续的参数都是当前类中方法的信息,你可以直接指定方法名称,或用一个数组提供方法名称和优先级。
在 ConstanzeStandard\EventDispatcher\ListenerProvider::addSubscriber 的过程中,$subscriber 函数会将当前类中的方法转化为普通的 Listener.
constanze-standard/event-dispatcher 适用场景与选型建议
constanze-standard/event-dispatcher 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 36 次下载、GitHub Stars 达 0, 最近一次更新时间为 2019 年 09 月 09 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「event」 「dispatcher」 「psr」 「psr-14」 「event-dispacher」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 constanze-standard/event-dispatcher 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 constanze-standard/event-dispatcher 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 constanze-standard/event-dispatcher 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Simple PSR-16 cache implementations for WordPress transient the OOP way
Package that provides an integration with Doctrine ORM to automatically dispatch Domain Events.
Event dispatcher package
Symfony bundle for broadway/broadway.
Error handler based on Booboo with HTML and JSON support
This is an Event Emitter equivalent to Node.js' Event Emitter.
统计信息
- 总下载量: 36
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 0
- 依赖项目数: 1
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2019-09-09