stk2k / eventstream
A simple PHP pub-sub library
Installs: 4 478
Dependents: 9
Suggesters: 0
Security: 0
Stars: 2
Watchers: 2
Forks: 0
Open Issues: 0
Requires
- php: >=7.2
Requires (Dev)
- php-coveralls/php-coveralls: ^2.0
- phpunit/phpunit: ^8.5.15
README
Description
You can use this library to build an application using simple pub-sub pattern. This library consists of three main objects below:
- EventStream
event stream is frontend facade of this system. you can push events to event source, register event listeners to event emitter, and flush events.
- EventSource
event source is an event provider. it has a role to provide events when event stream request. you have to declare event source, and call EventStream#source() method to attach source.
- EventEmitter
event emitter is an event dispatcher. it has a role to manage user callback functions. use Emitter/SimpleEventEmitter class for normal use, and pass it to EventStream#emitter() method.
Demo
01. event source
use stk2k\eventstream\EventStream; use stk2k\eventstream\EventSourceInterface; use stk2k\eventstream\emitter\SimpleEventEmitter; use stk2k\eventstream\exception\EventSourceIsNotPushableException; use Stk2k\EventStream\Event; class NumberEventSource implements EventSourceInterface { protected $numbers; public function __construct() { $this->numbers = ['one', 'two', 'three']; } public function canPush() : bool { return false; } public function push(Event $event) : EventSourceInterface { return $this; } public function next() { $number = array_shift($this->numbers); return $number ? new Event('number',$number) : null; } } // create event stream and setup callback, then flush all events (new EventStream()) ->channel('my channel', new NumberEventSource(), new SimpleEventEmitter()) ->listen('number', function(Event $e){ echo 'received number='.$e->getPayload(), PHP_EOL; }) ->flush(); // received number=one // received number=two // received number=three // you can not push event to unpushable event source try{ (new NumberEventSource())->push(new Even('number','four')); // throws EventSourceIsNotPushableException } catch(EventSourceIsNotPushableException $e){ echo 'Event not publishable.'; } class PushableNumberEventSource extends NumberEventSource { public function canPush() : bool { return true; } public function push(Event $event) : EventSourceInterface { if ($event->getName() === 'number'){ $this->numbers[] = $event->getPayload(); } return $this; } } // you acn push event to pushable event source try{ (new EventStream()) ->channel('my channel') ->source((new PushableNumberEventSource())->push('number','four')) ->emitter(new SimpleEventEmitter()) ->listen('number', function(Event $e){ echo 'received number='.$e->getPayload(), PHP_EOL; }) ->flush() ->push('number', 'five') ->flush(); } catch(EventSourceIsNotPushableException $e){ echo 'Event not publishable.'; } // received number=one // received number=two // received number=three // received number=four // received number=five
Usage
- create event stream object
- define your own event source class and attach new instance to stream.
- define your own event emitter or use bundled emitter classes and attach new instance to stream.
- define your own callback(s) and attach it(them) to stream or emitter.
- flush events in event source via EventStream#flush() method.
More Examples
- numbers.php: simple emitter and source sample
- multi_channel.php: listen different channel(event)s.
- regular_expression.php: single bind but listen multi channels by regular expression.
- wild_card.php: single bind but listen multi channels by wild card.
Requirement
PHP 7.2 or later
Installing stk2k/eventstream
The recommended way to install Calgamo/Bench is through Composer.
composer require stk2k/eventstream
After installing, you need to require Composer's autoloader:
require 'vendor/autoload.php';