Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Fix the legacy dispatcher argument order
Signed-off-by: Christoph Wurst <[email protected]>
  • Loading branch information
ChristophWurst committed Feb 9, 2021
commit abc61a9f63ba088aaea5b3c64d2db3316887061e
30 changes: 30 additions & 0 deletions lib/private/EventDispatcher/SymfonyAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
use OCP\ILogger;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use function is_object;
use function is_string;

/**
* @deprecated 20.0.0 use \OCP\EventDispatcher\IEventDispatcher
Expand All @@ -54,6 +56,28 @@ public function __construct(EventDispatcher $eventDispatcher, ILogger $logger) {
$this->logger = $logger;
}

private static function detectEventAndName($a, $b) {
if (is_object($a) && (is_string($b) || $b === null)) {
// a is the event, the other one is the optional name
return [$a, $b];
}
if (is_object($b) && (is_string($a) || $a === null)) {
// b is the event, the other one is the optional name
return [$b, $a];
}
if (is_string($a) && $b === null) {
// a is a payload-less event
return [null, $a];
}
if (is_string($b) && $a === null) {
// b is a payload-less event
return [null, $b];
}

// Anything else we can't detect
return [$a, $b];
}

/**
* Dispatches an event to all registered listeners.
*
Expand All @@ -67,7 +91,13 @@ public function __construct(EventDispatcher $eventDispatcher, ILogger $logger) {
* @deprecated 20.0.0
*/
public function dispatch($eventName, $event = null): object {
[$event, $eventName] = self::detectEventAndName($event, $eventName);

// type hinting is not possible, due to usage of GenericEvent
if ($event instanceof Event && $eventName === null) {
$this->eventDispatcher->dispatchTyped($event);
return $event;
}
if ($event instanceof Event) {
$this->eventDispatcher->dispatch($eventName, $event);
return $event;
Expand Down
36 changes: 36 additions & 0 deletions tests/lib/EventDispatcher/SymfonyAdapterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,26 @@ public function testDispatchSymfonyGenericEvent(): void {
self::assertEquals($result, $wrapped);
}

public function testDispatchOldSymfonyEventWithFlippedArgumentOrder(): void {
$event = new SymfonyEvent();
$eventName = 'symfony';
$symfonyDispatcher = $this->createMock(SymfonyDispatcher::class);
$this->eventDispatcher->expects(self::once())
->method('getSymfonyDispatcher')
->willReturn($symfonyDispatcher);
$symfonyDispatcher->expects(self::once())
->method('dispatch')
->with(
$event,
$eventName
)
->willReturnArgument(0);

$result = $this->adapter->dispatch($event, $eventName);

self::assertSame($result, $event);
}

public function testDispatchOldSymfonyEvent(): void {
$event = new SymfonyEvent();
$eventName = 'symfony';
Expand All @@ -120,6 +140,22 @@ public function testDispatchOldSymfonyEvent(): void {
self::assertSame($result, $event);
}

public function testDispatchCustomGenericEventWithFlippedArgumentOrder(): void {
$event = new GenericEvent();
$eventName = 'symfony';
$this->eventDispatcher->expects(self::once())
->method('dispatch')
->with(
$eventName,
$event
)
->willReturnArgument(0);

$result = $this->adapter->dispatch($event, $eventName);

self::assertSame($result, $event);
}

public function testDispatchCustomGenericEvent(): void {
$event = new GenericEvent();
$eventName = 'symfony';
Expand Down