Skip to content

Commit 1602654

Browse files
authored
fix(events): prevent enum event naming collisions (#1681)
1 parent 66dda2f commit 1602654

File tree

4 files changed

+31
-0
lines changed

4 files changed

+31
-0
lines changed

packages/event-bus/src/EventBusDiscovery.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Tempest\Reflection\ClassReflector;
1111
use Tempest\Reflection\TypeReflector;
1212
use Tempest\Support\Str;
13+
use UnitEnum;
1314

1415
final class EventBusDiscovery implements Discovery
1516
{
@@ -30,6 +31,10 @@ public function discover(DiscoveryLocation $location, ClassReflector $class): vo
3031

3132
$eventName = Str\parse($eventHandler->event, default: null);
3233

34+
if ($eventHandler->event instanceof UnitEnum) {
35+
$eventName = $eventHandler->event::class . '::' . $eventName;
36+
}
37+
3338
if ($eventName === null) {
3439
$parameters = iterator_to_array($method->getParameters());
3540

packages/event-bus/src/GenericEventBus.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Closure;
88
use Tempest\Container\Container;
99
use Tempest\Support\Str;
10+
use UnitEnum;
1011

1112
final readonly class GenericEventBus implements EventBus
1213
{
@@ -33,6 +34,11 @@ public function dispatch(string|object $event): void
3334
private function resolveHandlers(string|object $event): array
3435
{
3536
$eventName = Str\parse($event) ?: $event::class;
37+
38+
if ($event instanceof UnitEnum) {
39+
$eventName = $event::class . '::' . $eventName;
40+
}
41+
3642
$handlers = $this->eventBusConfig->handlers[$eventName] ?? [];
3743

3844
if (is_object($event)) {
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tests\Tempest\Fixtures\Events;
6+
7+
enum OtherEnumEvent
8+
{
9+
case Foo;
10+
}

tests/Integration/EventBus/EventBusTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Tests\Tempest\Fixtures\Events\DiscoveredEventBusMiddleware;
88
use Tests\Tempest\Fixtures\Events\EnumEvent;
99
use Tests\Tempest\Fixtures\Events\EventInterfaceImplementation;
10+
use Tests\Tempest\Fixtures\Events\OtherEnumEvent;
1011
use Tests\Tempest\Fixtures\Events\TestEventHandler;
1112
use Tests\Tempest\Fixtures\Handlers\EventInterfaceHandler;
1213
use Tests\Tempest\Integration\FrameworkIntegrationTestCase;
@@ -36,6 +37,15 @@ public function test_enum_events(): void
3637
$this->assertTrue(TestEventHandler::$fromEnumEvent);
3738
}
3839

40+
public function test_enum_events_with_colliding_names(): void
41+
{
42+
TestEventHandler::$fromEnumEvent = false;
43+
44+
event(OtherEnumEvent::Foo);
45+
46+
$this->assertFalse(TestEventHandler::$fromEnumEvent);
47+
}
48+
3949
public function test_interface_events_are_discovered(): void
4050
{
4151
EventInterfaceHandler::$itHappened = false;

0 commit comments

Comments
 (0)