phpway / pubsubwp
一个简单的发布-订阅库,支持为订阅者指定优先级
1.0
2017-11-16 21:48 UTC
Requires
- php: ^5.6 || ^7.0
Requires (Dev)
- phpunit/phpunit: ^5.0
- squizlabs/php_codesniffer: ^2.5
This package is not auto-updated.
Last update: 2024-09-29 04:25:59 UTC
README
我听到你了 - 为什么还需要另一个pubsub库,现在已经有这么多?我在寻找一个简单的PHP发布-订阅实现,具有以下特性
- 简单易用
- 可以为订阅者设置可选的优先级;当发布主题时,具有更高优先级的订阅者将被首先调用
- 订阅者可以在发布主题时停止调用队列中的后续回调
这个简单的pubsub库试图填补这一空白。
使用示例
创建pubsub实例
$pubsub = new \PubSubWP\PubSub;
订阅一些回调到某个主题
$pubsub->subscribe('topic.foo', function ($event) { $event['tape'] .= 'a'; }); $pubsub->subscribe('topic.foo', function ($event) { $event['tape'] .= 'b'; });
您也可以为回调订阅优先级。当主题发布时,回调会根据此优先级排序后再被调用(优先级更高的回调将首先执行)。默认优先级为0。
$priority = 10; $pubsub->subscribe('topic.foo', function ($event) { $event['tape'] .= 'A'; }, $priority);
当通过 PubSub::publish()
方法发布主题时,pubsub将创建一个事件对象(继承自 ArrayObject
),然后按优先级顺序开始传递给所有订阅的回调
$initialEventData = ['tape' => '']; $event = $pubsub->publish('topic.foo', $initialEventData);
事件的基本数据可以指定在第二个可选参数中。每个订阅的回调将接收此事件对象作为(唯一的)参数。
print $event['tape']; // 'Aab'
具有更高优先级的回调“在磁带上写入'A'”首先执行。
回调还可以决定跳过队列中尚未执行的所有其他回调。这可以通过调用 Event::stop()
方法来完成
$pubsub->subscribe( 'topic.foo', function ($event) { $event['tape'] .= '[STOP]'; $event->stop(); }, 5 );
这将导致跳过所有优先级低于5的回调
$event = $pubsub->publish('topic.foo', ['tape' => '']); print $event['tape']; // 'A[STOP]'
您还可以指定自己的将通过订阅的回调传递的事件。唯一的要求是它必须继承自 PubSubWP\Event
,这是默认事件的类
$myEvent = new MyEvent; $event = $pubsub->publish('topic.foo', $myEvent);