*/ private array $listeners = array(); /** * Subscribe a listener to one or more events. * * @param EventListenerInterface $listener Listener instance. * @return void */ public function subscribe( EventListenerInterface $listener ): void { foreach ( $listener->getSubscribedEvents() as $event_name ) { if ( ! isset( $this->listeners[ $event_name ] ) ) { $this->listeners[ $event_name ] = array(); } $this->listeners[ $event_name ][] = $listener; } } /** * Dispatch an event to all subscribed listeners. * * @param Event $event The event to dispatch. * @return void */ public function dispatch( Event $event ): void { $event_name = $event->getName(); if ( ! isset( $this->listeners[ $event_name ] ) ) { return; } foreach ( $this->listeners[ $event_name ] as $listener ) { try { $listener->handle( $event ); } catch ( \Throwable $e ) { Log::error( 'Event listener failed', array( 'event' => $event_name, 'listener' => get_class( $listener ), 'message' => $e->getMessage(), ) ); } } } }