Skip to content

Commit 0d6e6ee

Browse files
authored
fix(event-bus): reorder listen parameters for consistency (#1291)
1 parent f4da1bd commit 0d6e6ee

File tree

14 files changed

+101
-30
lines changed

14 files changed

+101
-30
lines changed

packages/event-bus/src/EventBus.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ interface EventBus
1010
{
1111
public function dispatch(string|object $event): void;
1212

13-
public function listen(string|object $event, Closure $handler): void;
13+
public function listen(Closure $handler, ?string $event = null): void;
1414
}

packages/event-bus/src/EventBusConfig.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
namespace Tempest\EventBus;
66

77
use Closure;
8+
use InvalidArgumentException;
89
use Tempest\Core\Middleware;
10+
use Tempest\Reflection\FunctionReflector;
911
use Tempest\Reflection\MethodReflector;
1012

1113
final class EventBusConfig
@@ -18,8 +20,17 @@ public function __construct(
1820
public Middleware $middleware = new Middleware(),
1921
) {}
2022

21-
public function addClosureHandler(string $event, Closure $handler): self
23+
public function addClosureHandler(Closure $handler, ?string $event = null): self
2224
{
25+
$event ??= new FunctionReflector($handler)
26+
->getParameter(key: 0)
27+
?->getType()
28+
->getName();
29+
30+
if (! $event) {
31+
throw new InvalidArgumentException('The first parameter of the closure must be the event name or type.');
32+
}
33+
2334
$handlerKey = spl_object_hash($handler);
2435

2536
$this->handlers[$event][$handlerKey] = new CallableEventHandler(

packages/event-bus/src/GenericEventBus.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ public function __construct(
1616
private EventBusConfig $eventBusConfig,
1717
) {}
1818

19-
public function listen(string|object $event, Closure $handler): void
19+
public function listen(Closure $handler, ?string $event = null): void
2020
{
21-
$this->eventBusConfig->addClosureHandler($event, $handler);
21+
$this->eventBusConfig->addClosureHandler($handler, $event);
2222
}
2323

2424
public function dispatch(string|object $event): void

packages/event-bus/src/Testing/FakeEventBus.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ public function __construct(
1414
public EventBusConfig $eventBusConfig,
1515
) {}
1616

17-
public function listen(string|object $event, Closure $handler): void
17+
public function listen(Closure $handler, ?string $event = null): void
1818
{
19-
$this->eventBusConfig->addClosureHandler($event, $handler);
19+
$this->eventBusConfig->addClosureHandler($handler, $event);
2020
}
2121

2222
public function dispatch(string|object $event): void

packages/event-bus/src/functions.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ function event(string|object $event): void
2020
/**
2121
* Registers a closure-based event listener for the given `$event`.
2222
*/
23-
function listen(string|object $event, Closure $handler): void
23+
function listen(Closure $handler, ?string $event = null): void
2424
{
2525
$config = get(EventBusConfig::class);
2626

27-
$config->addClosureHandler($event, $handler);
27+
$config->addClosureHandler($handler, $event);
2828
}
2929
}

packages/event-bus/tests/EventBusTest.php

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,15 +126,32 @@ public function test_closure_based_handlers_using_listen_method(): void
126126
$hasHappened = false;
127127

128128
// @mago-expect best-practices/no-unused-parameter
129-
$eventBus->listen('my-event', function (string $event) use (&$hasHappened): void {
129+
$eventBus->listen(function (string $event) use (&$hasHappened): void {
130130
$hasHappened = true;
131-
});
131+
}, event: 'my-event');
132132

133133
$eventBus->dispatch('my-event');
134134

135135
$this->assertTrue($hasHappened);
136136
}
137137

138+
public function test_closure_based_handlers_using_listen_method_and_first_parameter(): void
139+
{
140+
$container = new GenericContainer();
141+
$config = new EventBusConfig();
142+
$eventBus = new GenericEventBus($container, $config);
143+
$hasHappened = false;
144+
145+
// @mago-expect best-practices/no-unused-parameter
146+
$eventBus->listen(function (ItHappened $event) use (&$hasHappened): void {
147+
$hasHappened = true;
148+
});
149+
150+
$eventBus->dispatch(new ItHappened());
151+
152+
$this->assertTrue($hasHappened);
153+
}
154+
138155
public function test_closure_based_handlers_using_function(): void
139156
{
140157
GenericContainer::setInstance($container = new GenericContainer());
@@ -145,9 +162,9 @@ public function test_closure_based_handlers_using_function(): void
145162
$hasHappened = false;
146163

147164
// @mago-expect best-practices/no-unused-parameter
148-
listen('my-event', function (string $event) use (&$hasHappened): void {
165+
listen(function (string $event) use (&$hasHappened): void {
149166
$hasHappened = true;
150-
});
167+
}, event: 'my-event');
151168

152169
get(EventBus::class)->dispatch('my-event');
153170

packages/http/src/Session/CleanupSessionsCommand.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
public function __construct(
1818
private Console $console,
1919
private SessionManager $sessionManager,
20+
private EventBus $eventBus,
2021
) {}
2122

2223
#[ConsoleCommand(
@@ -26,7 +27,7 @@ public function __construct(
2627
#[Schedule(Every::MINUTE)]
2728
public function __invoke(): void
2829
{
29-
listen(SessionDestroyed::class, function (SessionDestroyed $event): void {
30+
$this->eventBus->listen(function (SessionDestroyed $event): void {
3031
$this->console->keyValue((string) $event->id, "<style='bold fg-green'>DESTROYED</style>");
3132
});
3233

packages/reflection/src/FunctionReflector.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
use Closure;
88
use Generator;
99
use ReflectionFunction as PHPReflectionFunction;
10+
use ReflectionParameter;
11+
use Tempest\Support\Arr;
1012

1113
final readonly class FunctionReflector implements Reflector
1214
{
@@ -32,6 +34,20 @@ public function getParameters(): Generator
3234
}
3335
}
3436

37+
public function getParameter(int|string $key): ?ParameterReflector
38+
{
39+
$parameter = array_find(
40+
array: $this->reflectionFunction->getParameters(),
41+
callback: fn (ReflectionParameter $parameter) => $parameter->getName() === $key || $parameter->getPosition() === $key,
42+
);
43+
44+
if ($parameter === null) {
45+
return null;
46+
}
47+
48+
return new ParameterReflector($parameter);
49+
}
50+
3551
public function getName(): string
3652
{
3753
return $this->reflectionFunction->getName();
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace Tempest\Reflection\Tests;
4+
5+
use PHPUnit\Framework\TestCase;
6+
use Tempest\Reflection\FunctionReflector;
7+
8+
final class FunctionReflectorTest extends TestCase
9+
{
10+
public function test_get_parameter(): void
11+
{
12+
$reflector = new FunctionReflector(fn (string $_test) => null);
13+
14+
$this->assertSame('_test', $reflector->getParameter(key: '_test')->getName());
15+
$this->assertSame('_test', $reflector->getParameter(key: 0)->getName());
16+
$this->assertNull($reflector->getParameter(key: 'does-not-exist'));
17+
}
18+
}

packages/router/src/Static/StaticCleanCommand.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public function __invoke(): void
3838

3939
$removed = 0;
4040

41-
$this->eventBus->listen(StaticPageRemoved::class, function (StaticPageRemoved $event) use (&$removed): void {
41+
$this->eventBus->listen(function (StaticPageRemoved $event) use (&$removed): void {
4242
$removed++;
4343
$this->keyValue("<style='fg-gray'>{$event->path}</style>", "<style='fg-green'>REMOVED</style>");
4444
});

0 commit comments

Comments
 (0)