1+ <?php
2+
3+ declare (strict_types=1 );
4+
5+ namespace Gember \EventSourcingSymfonyBundle ;
6+
7+ use Symfony \Component \Config \Definition \Configurator \DefinitionConfigurator ;
8+ use Symfony \Component \DependencyInjection \ContainerBuilder ;
9+ use Symfony \Component \DependencyInjection \Loader \Configurator \ContainerConfigurator ;
10+ use Symfony \Component \HttpKernel \Bundle \AbstractBundle ;
11+
12+ final class GemberEventSourcingBundle extends AbstractBundle
13+ {
14+ public function configure (DefinitionConfigurator $ definition ): void
15+ {
16+ $ definition ->rootNode ()
17+ ->children ()
18+ ->arrayNode ('cache ' )
19+ ->children ()
20+ ->booleanNode ('enabled ' )->end ()
21+ ->arrayNode ('psr6 ' )
22+ ->children ()
23+ ->scalarNode ('service ' )->end ()
24+ ->end ()
25+ ->end ()
26+ ->arrayNode ('psr16 ' )
27+ ->children ()
28+ ->scalarNode ('service ' )->end ()
29+ ->end ()
30+ ->end ()
31+ ->end ()
32+ ->end ()
33+ ->arrayNode ('event_registry ' )
34+ ->children ()
35+ ->arrayNode ('reflector ' )
36+ ->children ()
37+ ->scalarNode ('path ' )->end ()
38+ ->end ()
39+ ->end ()
40+ ->end ()
41+ ->end ()
42+ ->arrayNode ('message_bus ' )
43+ ->children ()
44+ ->arrayNode ('symfony ' )
45+ ->children ()
46+ ->scalarNode ('event_bus ' )->end ()
47+ ->end ()
48+ ->end ()
49+ ->end ()
50+ ->end ()
51+ ->arrayNode ('event_store ' )
52+ ->children ()
53+ ->arrayNode ('rdbms ' )
54+ ->children ()
55+ ->arrayNode ('doctrine_dbal ' )
56+ ->children ()
57+ ->scalarNode ('connection ' )->end ()
58+ ->end ()
59+ ->end ()
60+ ->end ()
61+ ->end ()
62+ ->end ()
63+ ->end ()
64+ ->arrayNode ('generator ' )
65+ ->children ()
66+ ->arrayNode ('identity ' )
67+ ->children ()
68+ ->scalarNode ('service ' )->end ()
69+ ->end ()
70+ ->end ()
71+ ->end ()
72+ ->end ()
73+ ->arrayNode ('serializer ' )
74+ ->children ()
75+ ->arrayNode ('symfony ' )
76+ ->children ()
77+ ->scalarNode ('serializer ' )->end ()
78+ ->end ()
79+ ->end ()
80+ ->end ()
81+ ->end ()
82+ ->end ();
83+ }
84+
85+ public function loadExtension (array $ config , ContainerConfigurator $ container , ContainerBuilder $ builder ): void
86+ {
87+ $ container ->import (__DIR__ . '/../config/services.yaml ' );
88+ $ services = $ container ->services ();
89+
90+ if ($ config ['cache ' ]['enabled ' ] ?? false ) {
91+ $ services ->get ('gember.event_sourcing.registry.cached.cached_event_registry_decorator ' )
92+ ->decorate ('gember.event_sourcing.registry.event_registry ' );
93+
94+ $ services ->get ('gember.event_sourcing.util.resolver.cached.cached_attribute_resolver_decorator ' )
95+ ->decorate ('gember.event_sourcing.util.attribute.resolver.attribute_resolver ' );
96+
97+ $ cacheType = isset ($ config ['cache ' ]['psr16 ' ]) ? 'psr16 ' : 'psr6 ' ;
98+ $ cacheService = ltrim ($ config ['cache ' ][$ cacheType ]['service ' ] ?? 'cache.app ' , '@ ' );
99+
100+ switch ($ cacheType ) {
101+ case 'psr6 ' :
102+ $ services ->alias ('gember.psr.cache.cache_item_pool_interface ' , $ cacheService );
103+ break ;
104+ default :
105+ $ services ->alias ('gember.psr.simple_cache.cache_interface ' , $ cacheService );
106+ $ services ->remove ('gember.psr.cache.cache_item_pool_interface ' );
107+ break ;
108+ }
109+ } else {
110+ // Remove all cache related service definitions
111+ $ services ->remove ('gember.event_sourcing.util.cache.cache ' );
112+ $ services ->remove ('gember.symfony.component.cache.psr16_cache ' );
113+ $ services ->remove ('gember.psr.cache.cache_item_pool_interface ' );
114+ }
115+
116+ $ services ->get ('gember.event_sourcing.registry.event_registry ' )
117+ ->arg ('$path ' , $ config ['registry ' ]['event_registry ' ]['reflector ' ]['path ' ] ?? '%kernel.project_dir%/src ' );
118+
119+ $ services ->alias (
120+ 'gember.symfony.component.messenger.message_bus.event_bus ' ,
121+ ltrim ($ config ['message_bus ' ]['symfony ' ]['event_bus ' ] ?? 'event.bus ' , '@ ' )
122+ );
123+
124+ $ services ->alias (
125+ 'gember.doctrine.dbal.connection ' ,
126+ ltrim ($ config ['event_store ' ]['rdbms ' ]['doctrine_dbal ' ]['connection ' ] ?? 'Doctrine\DBAL\Connection ' , '@ ' )
127+ );
128+
129+ if (!empty ($ config ['generator ' ]['identity ' ]['service ' ] ?? null )) {
130+ $ services ->alias (
131+ 'gember.event_sourcing.util.generator.identity.identity_generator ' ,
132+ ltrim ($ config ['generator ' ]['identity ' ]['service ' ], '@ ' )
133+ );
134+ }
135+
136+ $ services ->alias (
137+ 'gember.symfony.component.serializer.serializer_interface ' ,
138+ ltrim ($ config ['serializer ' ]['symfony ' ]['serializer ' ] ?? 'Symfony\Component\Serializer\SerializerInterface ' , '@ ' )
139+ );
140+ }
141+ }
0 commit comments