Skip to content

Commit

Permalink
Handle different signature in symfony 4.3+
Browse files Browse the repository at this point in the history
  • Loading branch information
demeritcowboy committed Nov 11, 2022
1 parent be0dc3c commit 068eb1a
Show file tree
Hide file tree
Showing 3 changed files with 153 additions and 8 deletions.
2 changes: 1 addition & 1 deletion Civi.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public static function container() {
/**
* 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
Expand Down
65 changes: 58 additions & 7 deletions Civi/Core/CiviEventDispatcher.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -16,10 +17,15 @@
*
* @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.
Expand Down Expand Up @@ -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.
*
Expand Down Expand Up @@ -90,6 +110,27 @@ public function addSubscriberServiceMap(string $subscriber, array $events) {
}
}

/**
* @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.
*
Expand All @@ -106,7 +147,7 @@ public function addListener($eventName, $listener, $priority = 0) {
$eventName = substr($eventName, 1);
$listener = new HookStyleListener($listener);
}
parent::addListener($eventName, $listener, $priority);
$this->dispatcher->addListener($eventName, $listener, $priority);
}

/**
Expand Down Expand Up @@ -169,7 +210,7 @@ public function addListenerService($eventName, $callback, $priority = 0) {
/**
* @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)) {
Expand Down Expand Up @@ -214,15 +255,25 @@ public function dispatch($eventName, Event $event = NULL) {
}
}
$this->bindPatterns($eventName);
return parent::dispatch($eventName, $event);
if ($event === NULL) {
$event = GenericHookEvent::create([]);
}
return $this->dispatcher->dispatch($event, $eventName);
}

/**
* @inheritDoc
*/
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);
}

/**
Expand All @@ -231,7 +282,7 @@ public function getListeners($eventName = NULL) {
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);
}

/**
Expand Down
94 changes: 94 additions & 0 deletions Civi/Core/CiviEventDispatcherInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
<?php

/*
* This is the same as symfony 4 EventDispatcherInterface
* except the Event parameter to dispatch() can be an object, to support
* symfony 5+ because there is no Event definition anymore.
*
* Also some style changes to make it pass style checking.
*/

namespace Civi\Core;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
* The EventDispatcherInterface is the central point of Symfony's event listener system.
* Listeners are registered on the manager and events are dispatched through the
* manager.
*
* @author Bernhard Schussek <[email protected]>
*/
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);

}

0 comments on commit 068eb1a

Please sign in to comment.