Merge pull request #25531 from nextcloud/fix/dispatcher-argument-order

Fix the legacy dispatcher argument order
This commit is contained in:
Roeland Jago Douma 2021-02-09 14:39:12 +01:00 committed by GitHub
commit f797a94393
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 66 additions and 0 deletions

View File

@ -35,6 +35,8 @@ use OCP\EventDispatcher\Event;
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
@ -54,6 +56,28 @@ class SymfonyAdapter implements EventDispatcherInterface {
$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.
*
@ -67,7 +91,13 @@ class SymfonyAdapter implements EventDispatcherInterface {
* @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;

View File

@ -100,6 +100,26 @@ class SymfonyAdapterTest extends TestCase {
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';
@ -120,6 +140,22 @@ class SymfonyAdapterTest extends TestCase {
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';