An event dispatcher based on PSR-14: Event Dispatcher.
composer require quillstack/eventsAn event is any object. A listener is anything callable which takes it:
use Quillstack\Events\EventDispatcher;
use Quillstack\Events\ListenerProvider;
$listeners = new ListenerProvider();
$listeners->listen(UserRegistered::class, function (UserRegistered $event) {
$this->mailer->welcome($event->email);
});
$dispatcher = new EventDispatcher($listeners);
$dispatcher->dispatch(new UserRegistered('radek@quillstack.com'));dispatch() gives the event back, so a listener can answer through it.
Listeners with a higher priority are called first, and two of the same priority are called in the order they were registered:
$listeners->listen(UserRegistered::class, $writeToTheLog, 10);
$listeners->listen(UserRegistered::class, $sendTheEmail);
$listeners->listen(UserRegistered::class, $cleanUpAfterwards, -10);A listener registered for a class is called for that class and for anything extending or implementing it, so listening for an interface catches every event carrying it:
$listeners->listen(HasUser::class, $recordWhoDidIt);An event extending StoppableEvent can be stopped by a listener, and the ones after it are
not called:
final class OrderPlaced extends StoppableEvent
{
}
$listeners->listen(OrderPlaced::class, function (OrderPlaced $event) {
if ($this->alreadyHandled($event)) {
$event->stopPropagation();
}
});composer testCoverage needs phpdbg:
composer test:coverageMIT. See LICENSE.