Skip to content

Commit 22db507

Browse files
committed
use resource tags for aggregates, events and headers
1 parent 073ca58 commit 22db507

10 files changed

Lines changed: 202 additions & 251 deletions

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"symfony/cache": "^6.4.0 || ^7.0.0 || ^8.0.0",
2424
"symfony/config": "^6.4.0 || ^7.0.0 || ^8.0.0",
2525
"symfony/console": "^6.4.1 || ^7.0.1 || ^8.0.0",
26-
"symfony/dependency-injection": "^6.4.1 || ^7.0.1 || ^8.0.0",
26+
"symfony/dependency-injection": "^7.3.0 || ^8.0.0",
2727
"symfony/event-dispatcher": "^6.4.1 || ^7.0.1 || ^8.0.0",
2828
"symfony/finder": "^6.4.0 || ^7.0.0 || ^8.0.0",
2929
"symfony/http-kernel": "^6.4.1 || ^7.0.1 || ^8.0.0",

composer.lock

Lines changed: 105 additions & 102 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/DependencyInjection/CommandHandlerCompilerPass.php

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
use Patchlevel\EventSourcing\CommandBus\Handler\CreateAggregateHandler;
88
use Patchlevel\EventSourcing\CommandBus\Handler\UpdateAggregateHandler;
99
use Patchlevel\EventSourcing\CommandBus\HandlerFinder;
10-
use Patchlevel\EventSourcing\Metadata\AggregateRoot\AggregateRootRegistry;
1110
use Patchlevel\EventSourcing\Repository\RepositoryManager;
1211
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
1312
use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -27,10 +26,7 @@ public function process(ContainerBuilder $container): void
2726

2827
$bus = $container->getParameter('patchlevel_event_sourcing.aggregate_handlers.bus');
2928

30-
/** @var AggregateRootRegistry $aggregateRootRegistry */
31-
$aggregateRootRegistry = $container->get(AggregateRootRegistry::class);
32-
33-
foreach ($aggregateRootRegistry->aggregateClasses() as $aggregateName => $aggregateClass) {
29+
foreach ($container->getParameter('event_sourcing.aggregates') as $aggregateName => $aggregateClass) {
3430
$parameterResolverId = sprintf('.event_sourcing.handler_parameter_resolver.%s', $aggregateName);
3531

3632
foreach (HandlerFinder::findInClass($aggregateClass) as $aggregateHandler) {

src/DependencyInjection/Configuration.php

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,6 @@
6565
* translators: list<string>
6666
* }
6767
* },
68-
* aggregates: list<string>,
69-
* events: list<string>,
70-
* headers: list<string>,
7168
* snapshot_stores: array<string, array{type: string, service: string}>,
7269
* migration: array{path: string, namespace: string},
7370
* cryptography: array{
@@ -143,24 +140,6 @@ public function getConfigTreeBuilder(): TreeBuilder
143140
->end()
144141
->end()
145142

146-
->arrayNode('events')
147-
->beforeNormalization()->castToArray()->end()
148-
->defaultValue([])
149-
->scalarPrototype()->end()
150-
->end()
151-
152-
->arrayNode('aggregates')
153-
->beforeNormalization()->castToArray()->end()
154-
->defaultValue([])
155-
->scalarPrototype()->end()
156-
->end()
157-
158-
->arrayNode('headers')
159-
->beforeNormalization()->castToArray()->end()
160-
->defaultValue([])
161-
->scalarPrototype()->end()
162-
->end()
163-
164143
->arrayNode('clock')
165144
->addDefaultsIfNotSet()
166145
->children()

src/DependencyInjection/HandlerServiceLocatorCompilerPass.php

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
use Patchlevel\EventSourcing\Attribute\Inject;
88
use Patchlevel\EventSourcing\CommandBus\Handler\ServiceNotResolvable;
99
use Patchlevel\EventSourcing\CommandBus\HandlerFinder;
10-
use Patchlevel\EventSourcing\Metadata\AggregateRoot\AggregateRootRegistry;
1110
use Patchlevel\EventSourcingBundle\CommandBus\SymfonyParameterResolver;
1211
use Psr\Container\ContainerInterface;
1312
use ReflectionAttribute;
@@ -32,10 +31,7 @@ public function process(ContainerBuilder $container): void
3231
return;
3332
}
3433

35-
/** @var AggregateRootRegistry $aggregateRootRegistry */
36-
$aggregateRootRegistry = $container->get(AggregateRootRegistry::class);
37-
38-
foreach ($aggregateRootRegistry->aggregateClasses() as $aggregateName => $aggregateClass) {
34+
foreach ($container->getParameter('event_sourcing.aggregates') as $aggregateName => $aggregateClass) {
3935
$parameterResolverId = sprintf('.event_sourcing.handler_parameter_resolver.%s', $aggregateName);
4036
$services = [];
4137

src/DependencyInjection/PatchlevelEventSourcingExtension.php

Lines changed: 29 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Doctrine\ORM\Tools\ToolEvents;
2020
use Patchlevel\EventSourcing\Attribute\Aggregate;
2121
use Patchlevel\EventSourcing\Attribute\Event;
22+
use Patchlevel\EventSourcing\Attribute\Header;
2223
use Patchlevel\EventSourcing\Attribute\Processor;
2324
use Patchlevel\EventSourcing\Attribute\Projector;
2425
use Patchlevel\EventSourcing\Attribute\Subscriber;
@@ -61,9 +62,7 @@
6162
use Patchlevel\EventSourcing\Metadata\AggregateRoot\AggregateRootMetadataAwareMetadataFactory;
6263
use Patchlevel\EventSourcing\Metadata\AggregateRoot\AggregateRootMetadataFactory;
6364
use Patchlevel\EventSourcing\Metadata\AggregateRoot\AggregateRootRegistry;
64-
use Patchlevel\EventSourcing\Metadata\AggregateRoot\AttributeAggregateRootRegistryFactory;
6565
use Patchlevel\EventSourcing\Metadata\Event\AttributeEventMetadataFactory;
66-
use Patchlevel\EventSourcing\Metadata\Event\AttributeEventRegistryFactory;
6766
use Patchlevel\EventSourcing\Metadata\Event\EventMetadataFactory;
6867
use Patchlevel\EventSourcing\Metadata\Event\EventRegistry;
6968
use Patchlevel\EventSourcing\Metadata\Message\AttributeMessageHeaderRegistryFactory;
@@ -153,6 +152,7 @@
153152
use Symfony\Component\DependencyInjection\ContainerInterface;
154153
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
155154
use Symfony\Component\DependencyInjection\Extension\Extension;
155+
use Symfony\Component\DependencyInjection\Parameter;
156156
use Symfony\Component\DependencyInjection\Reference;
157157

158158
use function class_exists;
@@ -164,8 +164,6 @@ final class PatchlevelEventSourcingExtension extends Extension
164164
/** @param array<array-key, mixed> $configs */
165165
public function load(array $configs, ContainerBuilder $container): void
166166
{
167-
$this->removeNonServices($container);
168-
169167
$configuration = new Configuration();
170168

171169
/** @var Config $config */
@@ -185,7 +183,7 @@ public function load(array $configs, ContainerBuilder $container): void
185183
$this->configureConnection($config, $container);
186184
$this->configureStore($config, $container);
187185
$this->configureSnapshots($config, $container);
188-
$this->configureAggregates($config, $container);
186+
$this->configureAggregates($container);
189187
$this->configureCommands($container);
190188
$this->configureProfiler($container);
191189
$this->configureClock($config, $container);
@@ -202,11 +200,17 @@ public function load(array $configs, ContainerBuilder $container): void
202200
/** @param Config $config */
203201
private function configureSerializer(array $config, ContainerBuilder $container): void
204202
{
205-
$container->register(AttributeEventRegistryFactory::class);
203+
$container->registerAttributeForAutoconfiguration(
204+
Event::class,
205+
static function (ChildDefinition $definition, Event $attribute): void {
206+
$definition->addResourceTag('event_sourcing.event', ['name' => $attribute->name]);
207+
},
208+
);
209+
210+
$container->setParameter('event_sourcing.events', []);
206211

207212
$container->register(EventRegistry::class)
208-
->setFactory([new Reference(AttributeEventRegistryFactory::class), 'create'])
209-
->setArguments([$config['events']]);
213+
->setArguments([new Parameter('event_sourcing.events')]);
210214

211215
$container->register(AttributeEventMetadataFactory::class);
212216
$container->setAlias(EventMetadataFactory::class, AttributeEventMetadataFactory::class);
@@ -224,12 +228,15 @@ private function configureSerializer(array $config, ContainerBuilder $container)
224228

225229
$container->setAlias(EventSerializer::class, DefaultEventSerializer::class);
226230

227-
$container->register(AttributeMessageHeaderRegistryFactory::class);
228-
$container->setAlias(MessageHeaderRegistryFactory::class, AttributeMessageHeaderRegistryFactory::class);
231+
$container->registerAttributeForAutoconfiguration(
232+
Header::class,
233+
static function (ChildDefinition $definition, Header $attribute): void {
234+
$definition->addResourceTag('event_sourcing.header', ['name' => $attribute->name]);
235+
},
236+
);
229237

230238
$container->register(MessageHeaderRegistry::class)
231-
->setFactory([new Reference(MessageHeaderRegistryFactory::class), 'create'])
232-
->setArguments([$config['headers']]);
239+
->setArguments([new Parameter('event_sourcing.headers')]);
233240

234241
$container->register(DefaultHeadersSerializer::class)
235242
->setArguments([
@@ -879,17 +886,22 @@ private function configureSnapshots(array $config, ContainerBuilder $container):
879886
$container->setAlias(SnapshotStore::class, DefaultSnapshotStore::class);
880887
}
881888

882-
/** @param Config $config */
883-
private function configureAggregates(array $config, ContainerBuilder $container): void
889+
private function configureAggregates(ContainerBuilder $container): void
884890
{
891+
$container->registerAttributeForAutoconfiguration(
892+
Aggregate::class,
893+
static function (ChildDefinition $definition, Aggregate $attribute): void {
894+
$definition->addResourceTag('event_sourcing.aggregate', ['name' => $attribute->name]);
895+
},
896+
);
897+
885898
$container->register(AggregateRootMetadataAwareMetadataFactory::class);
886899
$container->setAlias(AggregateRootMetadataFactory::class, AggregateRootMetadataAwareMetadataFactory::class);
887900

888-
$container->register(AttributeAggregateRootRegistryFactory::class);
901+
$container->setParameter('event_sourcing.aggregates', []);
889902

890903
$container->register(AggregateRootRegistry::class)
891-
->setFactory([new Reference(AttributeAggregateRootRegistryFactory::class), 'create'])
892-
->setArguments([$config['aggregates']]);
904+
->setArguments([new Parameter('event_sourcing.aggregates')]);
893905

894906
$container->register(DefaultRepositoryManager::class)
895907
->setArguments([
@@ -1221,26 +1233,4 @@ private function configureValueResolver(ContainerBuilder $container): void
12211233
$container->register(IdentifierValueResolver::class)
12221234
->addTag('controller.argument_value_resolver', ['priority' => 200]);
12231235
}
1224-
1225-
private function removeNonServices(ContainerBuilder $container): void
1226-
{
1227-
$container->registerAttributeForAutoconfiguration(
1228-
Aggregate::class,
1229-
static function (ChildDefinition $definition): void {
1230-
$definition->setAbstract(true)->addTag(
1231-
'container.excluded',
1232-
['source' => sprintf('with #[%s] attribute', Aggregate::class)],
1233-
);
1234-
},
1235-
);
1236-
$container->registerAttributeForAutoconfiguration(
1237-
Event::class,
1238-
static function (ChildDefinition $definition): void {
1239-
$definition->setAbstract(true)->addTag(
1240-
'container.excluded',
1241-
['source' => sprintf('with #[%s] attribute', Event::class)],
1242-
);
1243-
},
1244-
);
1245-
}
12461236
}

src/DependencyInjection/RepositoryCompilerPass.php

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,10 @@
44

55
namespace Patchlevel\EventSourcingBundle\DependencyInjection;
66

7-
use Patchlevel\EventSourcing\Metadata\AggregateRoot\AggregateRootRegistry;
87
use Patchlevel\EventSourcing\Repository\Repository;
98
use Patchlevel\EventSourcing\Repository\RepositoryManager;
109
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
1110
use Symfony\Component\DependencyInjection\ContainerBuilder;
12-
use Symfony\Component\DependencyInjection\ContainerInterface;
1311
use Symfony\Component\DependencyInjection\Definition;
1412
use Symfony\Component\DependencyInjection\Reference;
1513

@@ -18,20 +16,14 @@ final class RepositoryCompilerPass implements CompilerPassInterface
1816
{
1917
public function process(ContainerBuilder $container): void
2018
{
21-
$aggregateRootRegistry = $container->get(AggregateRootRegistry::class, ContainerInterface::NULL_ON_INVALID_REFERENCE);
22-
23-
if (!$aggregateRootRegistry instanceof AggregateRootRegistry) {
24-
return;
25-
}
26-
27-
foreach ($aggregateRootRegistry->aggregateNames() as $aggregateName) {
19+
foreach ($container->getParameter('event_sourcing.aggregates') as $aggregateName => $aggregateClass) {
2820
$aggregateRepositoryName = $aggregateName . 'Repository';
2921
$aggregateRepositoryId = 'event_sourcing.' . $aggregateName . '.repository';
3022

3123
$definition = new Definition(Repository::class);
3224
$definition->setPublic(false);
3325
$definition->setFactory([new Reference(RepositoryManager::class), 'get']);
34-
$definition->setArgument(0, $aggregateRootRegistry->aggregateClass($aggregateName));
26+
$definition->setArgument(0, $aggregateClass);
3527

3628
$container->setDefinition($aggregateRepositoryId, $definition);
3729
$container->registerAliasForArgument($aggregateRepositoryId, Repository::class, $aggregateRepositoryName)->setPublic(false);
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Patchlevel\EventSourcingBundle\DependencyInjection;
6+
7+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
8+
use Symfony\Component\DependencyInjection\ContainerBuilder;
9+
10+
/** @internal */
11+
final class ResourceCompilerPass implements CompilerPassInterface
12+
{
13+
private const RESSOURCES = [
14+
'event_sourcing.aggregate' => 'event_sourcing.aggregates',
15+
'event_sourcing.event' => 'event_sourcing.events',
16+
'event_sourcing.header' => 'event_sourcing.headers',
17+
];
18+
19+
public function process(ContainerBuilder $container): void
20+
{
21+
foreach (self::RESSOURCES as $tag => $parameter) {
22+
$map = [];
23+
foreach ($container->findTaggedResourceIds($tag) as $id => $tags) {
24+
foreach ($tags as $tag) {
25+
$map[$tag['name']] = $id;
26+
}
27+
}
28+
29+
$container->setParameter($parameter, $map);
30+
}
31+
}
32+
}

src/PatchlevelEventSourcingBundle.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Patchlevel\EventSourcingBundle;
66

7+
use Patchlevel\EventSourcingBundle\DependencyInjection\ResourceCompilerPass;
78
use Patchlevel\EventSourcingBundle\DependencyInjection\CommandHandlerCompilerPass;
89
use Patchlevel\EventSourcingBundle\DependencyInjection\HandlerServiceLocatorCompilerPass;
910
use Patchlevel\EventSourcingBundle\DependencyInjection\QueryHandlerCompilerPass;
@@ -17,6 +18,7 @@ final class PatchlevelEventSourcingBundle extends Bundle
1718
{
1819
public function build(ContainerBuilder $container): void
1920
{
21+
$container->addCompilerPass(new ResourceCompilerPass(), priority: 100);
2022
$container->addCompilerPass(new RepositoryCompilerPass());
2123
$container->addCompilerPass(new SubscriberGuardCompilePass());
2224
$container->addCompilerPass(new CommandHandlerCompilerPass(), priority: 100);

0 commit comments

Comments
 (0)