1: <?php
2:
3: /*
4: * Library to use PortBilling events with PSR-14 event dispatch
5: */
6:
7: namespace Porta\Psr14Event;
8:
9: use Psr\EventDispatcher\EventDispatcherInterface;
10: use Psr\EventDispatcher\ListenerProviderInterface;
11: use Psr\EventDispatcher\StoppableEventInterface;
12:
13: /**
14: * Simple implemention of PSR-14 EventDispatcher
15: *
16: * @api
17: */
18: class Dispatcher implements EventDispatcherInterface
19: {
20:
21: protected ListenerProviderInterface $provider;
22:
23: /**
24: * Setup the Dispatcher with one ListenreProvider
25: *
26: * @param ListenerProviderInterface $provider
27: * @api
28: */
29: public function __construct(ListenerProviderInterface $provider)
30: {
31: $this->provider = $provider;
32: }
33:
34: /**
35: * Performs event dispatch as per PSR-14 spec
36: *
37: * @param object $event Event to dispatch
38: * @return object Dispatched event.
39: */
40: public function dispatch(object $event): object
41: {
42: foreach ($this->provider->getListenersForEvent($event) as $listener) {
43: if ($event instanceof StoppableEventInterface && $event->isPropagationStopped()) {
44: return $event;
45: }
46: $listener($event);
47: }
48: return $event;
49: }
50: }
51: