Skip to content

Commit d2bc4d5

Browse files
committed
Add new #[SubscriptionId] attribute to replace SubscritionUtil trait
1 parent ce3769a commit d2bc4d5

File tree

17 files changed

+218
-172
lines changed

17 files changed

+218
-172
lines changed

src/Attribute/Processor.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
final class Processor extends Subscriber
1212
{
1313
public function __construct(
14-
string $id,
14+
string|null $id = null,
1515
string $group = 'processor',
1616
RunMode $runMode = RunMode::FromNow,
1717
) {

src/Attribute/Projector.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
final class Projector extends Subscriber
1212
{
1313
public function __construct(
14-
string $id,
14+
string|null $id = null,
1515
string $group = 'projector',
1616
RunMode $runMode = RunMode::FromBeginning,
1717
) {

src/Attribute/Subscriber.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
class Subscriber
1212
{
1313
public function __construct(
14-
public readonly string $id,
14+
public readonly string|null $id = null,
1515
public readonly RunMode $runMode,
1616
public readonly string $group = 'default',
1717
) {

src/Attribute/SubscriptionId.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Patchlevel\EventSourcing\Attribute;
6+
7+
use Attribute;
8+
9+
#[Attribute(Attribute::TARGET_CLASS_CONSTANT)]
10+
final class SubscriptionId
11+
{
12+
}

src/Metadata/Subscriber/AttributeSubscriberMetadataFactory.php

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Patchlevel\EventSourcing\Attribute\Setup;
1010
use Patchlevel\EventSourcing\Attribute\Subscribe;
1111
use Patchlevel\EventSourcing\Attribute\Subscriber;
12+
use Patchlevel\EventSourcing\Attribute\SubscriptionId;
1213
use Patchlevel\EventSourcing\Attribute\Teardown;
1314
use ReflectionAttribute;
1415
use ReflectionClass;
@@ -109,8 +110,27 @@ public function metadata(string $subscriber): SubscriberMetadata
109110
throw DuplicateSubscribeMethod::mixedWithAll($subscriber);
110111
}
111112

113+
$subscriptionId = $subscriberInfo->id;
114+
115+
foreach ($reflector->getReflectionConstants() as $constant) {
116+
if ($constant->getAttributes(SubscriptionId::class)) {
117+
if ($subscriptionId !== null) {
118+
throw new SubscriberHasMultipleSubscriptionIds(
119+
$subscriber,
120+
[$subscriptionId, $constant->getValue()]
121+
);
122+
}
123+
124+
$subscriptionId = $constant->getValue();
125+
}
126+
}
127+
128+
if ($subscriptionId === null) {
129+
throw new SubscriptionIdMissing($subscriber);
130+
}
131+
112132
$metadata = new SubscriberMetadata(
113-
$subscriberInfo->id,
133+
$subscriptionId,
114134
$subscriberInfo->group,
115135
$subscriberInfo->runMode,
116136
$subscribeMethods,
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Patchlevel\EventSourcing\Metadata\Subscriber;
6+
7+
use Patchlevel\EventSourcing\Metadata\MetadataException;
8+
9+
use function sprintf;
10+
11+
final class SubscriberHasMultipleSubscriptionIds extends MetadataException
12+
{
13+
/**
14+
* @param class-string $subscriber
15+
* @param list<string> $ids
16+
*/
17+
public function __construct(string $subscriberClass, array $ids)
18+
{
19+
parent::__construct(
20+
sprintf(
21+
'There are multiple subscription ids (%s) defined for the subscriber "%s".',
22+
$subscriberClass,
23+
implode(', ', $ids),
24+
),
25+
);
26+
}
27+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Patchlevel\EventSourcing\Metadata\Subscriber;
6+
7+
use Patchlevel\EventSourcing\Metadata\MetadataException;
8+
9+
use function sprintf;
10+
11+
final class SubscriptionIdMissing extends MetadataException
12+
{
13+
/** @param class-string $subscriber */
14+
public function __construct(string $subscriberClass)
15+
{
16+
parent::__construct(
17+
sprintf(
18+
'There is no subscription id defined for the subscriber "%s". Define it via #[Subscriber] or #[SubscriptionId] attribute.',
19+
$subscriberClass,
20+
),
21+
);
22+
}
23+
}

src/Subscription/Subscriber/SubscriberHelper.php

Lines changed: 0 additions & 27 deletions
This file was deleted.

src/Subscription/Subscriber/SubscriberUtil.php

Lines changed: 0 additions & 37 deletions
This file was deleted.

tests/Benchmark/BasicImplementation/Projection/BatchProfileProjector.php

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,17 @@
88
use Patchlevel\EventSourcing\Attribute\Projector;
99
use Patchlevel\EventSourcing\Attribute\Setup;
1010
use Patchlevel\EventSourcing\Attribute\Subscribe;
11+
use Patchlevel\EventSourcing\Attribute\SubscriptionId;
1112
use Patchlevel\EventSourcing\Attribute\Teardown;
1213
use Patchlevel\EventSourcing\Subscription\Subscriber\BatchableSubscriber;
13-
use Patchlevel\EventSourcing\Subscription\Subscriber\SubscriberUtil;
1414
use Patchlevel\EventSourcing\Tests\Benchmark\BasicImplementation\Events\NameChanged;
1515
use Patchlevel\EventSourcing\Tests\Benchmark\BasicImplementation\Events\ProfileCreated;
1616

17-
#[Projector('profile')]
17+
#[Projector]
1818
final class BatchProfileProjector implements BatchableSubscriber
1919
{
20-
use SubscriberUtil;
20+
#[SubscriptionId]
21+
private const TABLE_NAME = 'projection_profile';
2122

2223
/** @var array<string, string> */
2324
private array $nameChanged = [];
@@ -30,20 +31,23 @@ public function __construct(
3031
#[Setup]
3132
public function create(): void
3233
{
33-
$this->connection->executeStatement("CREATE TABLE IF NOT EXISTS {$this->table()} (id VARCHAR PRIMARY KEY, name VARCHAR);");
34+
$this->connection->executeStatement(sprintf(
35+
"CREATE TABLE IF NOT EXISTS %s (id VARCHAR PRIMARY KEY, name VARCHAR);",
36+
self::TABLE_NAME,
37+
));
3438
}
3539

3640
#[Teardown]
3741
public function drop(): void
3842
{
39-
$this->connection->executeStatement("DROP TABLE IF EXISTS {$this->table()};");
43+
$this->connection->executeStatement(sprintf("DROP TABLE IF EXISTS %s;", self::TABLE_NAME));
4044
}
4145

4246
#[Subscribe(ProfileCreated::class)]
4347
public function onProfileCreated(ProfileCreated $profileCreated): void
4448
{
4549
$this->connection->insert(
46-
$this->table(),
50+
self::TABLE_NAME,
4751
[
4852
'id' => $profileCreated->profileId->toString(),
4953
'name' => $profileCreated->name,
@@ -73,7 +77,7 @@ public function commitBatch(): void
7377
$this->connection->transactional(function (): void {
7478
foreach ($this->nameChanged as $profileId => $name) {
7579
$this->connection->update(
76-
$this->table(),
80+
self::TABLE_NAME,
7781
['name' => $name],
7882
['id' => $profileId],
7983
);

0 commit comments

Comments
 (0)