From 068eb1a31f6a8bb8f19be60ab3b142727ac0c4f3 Mon Sep 17 00:00:00 2001 From: demeritcowboy Date: Mon, 18 Apr 2022 19:15:40 -0400 Subject: [PATCH] Handle different signature in symfony 4.3+ --- Civi.php | 2 +- Civi/Core/CiviEventDispatcher.php | 65 +++++++++++++-- Civi/Core/CiviEventDispatcherInterface.php | 94 ++++++++++++++++++++++ 3 files changed, 153 insertions(+), 8 deletions(-) create mode 100644 Civi/Core/CiviEventDispatcherInterface.php diff --git a/Civi.php b/Civi.php index 86e72ee847..d582bba2b0 100644 --- a/Civi.php +++ b/Civi.php @@ -63,7 +63,7 @@ class Civi { /** * Get the event dispatcher. * - * @return \Symfony\Component\EventDispatcher\EventDispatcherInterface + * @return \Civi\Core\CiviEventDispatcherInterface */ public static function dispatcher() { // NOTE: The dispatcher object is initially created as a boot service diff --git a/Civi/Core/CiviEventDispatcher.php b/Civi/Core/CiviEventDispatcher.php index 3aec51f3d1..11c7c048a7 100644 --- a/Civi/Core/CiviEventDispatcher.php +++ b/Civi/Core/CiviEventDispatcher.php @@ -2,9 +2,10 @@ namespace Civi\Core; +use Civi\Core\Event\GenericHookEvent; use Civi\Core\Event\HookStyleListener; use Symfony\Component\EventDispatcher\EventDispatcher; -use Symfony\Component\EventDispatcher\Event; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; /** * Class CiviEventDispatcher @@ -16,10 +17,15 @@ use Symfony\Component\EventDispatcher\Event; * * @see \CRM_Utils_Hook */ -class CiviEventDispatcher extends EventDispatcher { +class CiviEventDispatcher implements CiviEventDispatcherInterface { const DEFAULT_HOOK_PRIORITY = -100; + /** + * @var Symfony\Component\EventDispatcher\EventDispatcher + */ + private $dispatcher; + /** * Track the list of hook-events for which we have autoregistered * the hook adapter. @@ -51,6 +57,20 @@ class CiviEventDispatcher extends EventDispatcher { */ private $dispatchPolicyRegex = NULL; + /** + * Constructor + */ + public function __construct() { + $this->dispatcher = new EventDispatcher(); + } + + /** + * Get Event Dispatcher + */ + public function getDispatcher() { + return $this->dispatcher; + } + /** * Determine whether $eventName should delegate to the CMS hook system. * @@ -90,6 +110,27 @@ class CiviEventDispatcher extends EventDispatcher { } } + /** + * @inheritDoc + */ + public function addSubscriber(EventSubscriberInterface $subscriber) { + return $this->dispatcher->addSubscriber($subscriber); + } + + /** + * @inheritDoc + */ + public function removeSubscriber(EventSubscriberInterface $subscriber) { + return $this->dispatcher->removeSubscriber($subscriber); + } + + /** + * @inheritDoc + */ + public function getListenerPriority($eventName, $listener) { + return $this->dispatcher->getListenerPriority($eventName, $listener); + } + /** * Add a test listener. * @@ -106,7 +147,7 @@ class CiviEventDispatcher extends EventDispatcher { $eventName = substr($eventName, 1); $listener = new HookStyleListener($listener); } - parent::addListener($eventName, $listener, $priority); + $this->dispatcher->addListener($eventName, $listener, $priority); } /** @@ -169,7 +210,7 @@ class CiviEventDispatcher extends EventDispatcher { /** * @inheritDoc */ - public function dispatch($eventName, Event $event = NULL) { + public function dispatch($eventName, $event = NULL) { // Dispatch policies add systemic overhead and (normally) should not be evaluated. JNZ. if ($this->dispatchPolicyRegex !== NULL) { switch ($mode = $this->checkDispatchPolicy($eventName)) { @@ -214,7 +255,10 @@ class CiviEventDispatcher extends EventDispatcher { } } $this->bindPatterns($eventName); - return parent::dispatch($eventName, $event); + if ($event === NULL) { + $event = GenericHookEvent::create([]); + } + return $this->dispatcher->dispatch($event, $eventName); } /** @@ -222,7 +266,14 @@ class CiviEventDispatcher extends EventDispatcher { */ public function getListeners($eventName = NULL) { $this->bindPatterns($eventName); - return parent::getListeners($eventName); + return $this->dispatcher->getListeners($eventName); + } + + /** + * @inheritDoc + */ + public function removeListener($eventName, $listener) { + return $this->dispatcher->removeListener($eventName, $listener); } /** @@ -231,7 +282,7 @@ class CiviEventDispatcher extends EventDispatcher { public function hasListeners($eventName = NULL) { // All hook_* events have default listeners, so hasListeners(NULL) is a truism. return ($eventName === NULL || $this->isHookEvent($eventName)) - ? TRUE : parent::hasListeners($eventName); + ? TRUE : $this->dispatcher->hasListeners($eventName); } /** diff --git a/Civi/Core/CiviEventDispatcherInterface.php b/Civi/Core/CiviEventDispatcherInterface.php new file mode 100644 index 0000000000..fdd9238009 --- /dev/null +++ b/Civi/Core/CiviEventDispatcherInterface.php @@ -0,0 +1,94 @@ + + */ +interface CiviEventDispatcherInterface { + + /** + * Dispatches an event to all registered listeners. + * + * @param string $eventName The name of the event to dispatch. The name of + * the event is the name of the method that is invoked on listeners. + * @param Event|null $event The event to pass to the event handlers/listeners + * If not supplied, an empty Event instance is created + * + * @return Event + */ + public function dispatch($eventName, $event = NULL); + + /** + * Adds an event listener that listens on the specified events. + * + * @param string $eventName The event to listen on + * @param callable $listener The listener + * @param int $priority The higher this value, the earlier an event + * listener will be triggered in the chain (defaults to 0) + */ + public function addListener($eventName, $listener, $priority = 0); + + /** + * Adds an event subscriber. + * + * The subscriber is asked for all the events it is + * interested in and added as a listener for these events. + */ + public function addSubscriber(EventSubscriberInterface $subscriber); + + /** + * Removes an event listener from the specified events. + * + * @param string $eventName The event to remove a listener from + * @param callable $listener The listener to remove + */ + public function removeListener($eventName, $listener); + + public function removeSubscriber(EventSubscriberInterface $subscriber); + + /** + * Gets the listeners of a specific event or all listeners sorted by descending priority. + * + * @param string|null $eventName The name of the event + * + * @return array The event listeners for the specified event, or all event listeners by event name + */ + public function getListeners($eventName = NULL); + + /** + * Gets the listener priority for a specific event. + * + * Returns null if the event or the listener does not exist. + * + * @param string $eventName The name of the event + * @param callable $listener The listener + * + * @return int|null The event listener priority + */ + public function getListenerPriority($eventName, $listener); + + /** + * Checks whether an event has any registered listeners. + * + * @param string|null $eventName The name of the event + * + * @return bool true if the specified event has any listeners, false otherwise + */ + public function hasListeners($eventName = NULL); + +} -- 2.25.1