SimpleBusPass   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 273
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 10

Importance

Changes 0
Metric Value
wmc 6
c 0
b 0
f 0
lcom 0
cbo 10
dl 0
loc 273
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A process() 0 16 4
B commandBus() 0 102 1
B eventBus() 0 135 1
1
<?php
2
3
/*
4
 * This file is part of the BenGorFile package.
5
 *
6
 * (c) Beñat Espiña <[email protected]>
7
 * (c) Gorka Laucirica <[email protected]>
8
 *
9
 * For the full copyright and license information, please view the LICENSE
10
 * file that was distributed with this source code.
11
 */
12
13
namespace BenGorFile\SimpleBusBridgeBundle\DependencyInjection\Compiler;
14
15
use BenGorFile\SimpleBusBridge\CommandBus\SimpleBusFileCommandBus;
16
use BenGorFile\SimpleBusBridge\EventBus\SimpleBusFileEventBus;
17
use BenGorFile\SimpleBusBridgeBundle\DependencyInjection\SimpleBusTaggerExtension;
18
use SimpleBus\Message\Bus\Middleware\MessageBusSupportingMiddleware;
19
use SimpleBus\Message\CallableResolver\CallableCollection;
20
use SimpleBus\Message\CallableResolver\CallableMap;
21
use SimpleBus\Message\CallableResolver\ServiceLocatorAwareCallableResolver;
22
use SimpleBus\Message\Handler\Resolver\NameBasedMessageHandlerResolver;
23
use SimpleBus\Message\Name\ClassBasedNameResolver;
24
use SimpleBus\Message\Recorder\AggregatesRecordedMessages;
25
use SimpleBus\Message\Subscriber\Resolver\NameBasedMessageSubscriberResolver;
26
use SimpleBus\SymfonyBridge\DependencyInjection\Compiler\AddMiddlewareTags;
27
use SimpleBus\SymfonyBridge\DependencyInjection\Compiler\CompilerPassUtil;
28
use SimpleBus\SymfonyBridge\DependencyInjection\Compiler\ConfigureMiddlewares;
29
use SimpleBus\SymfonyBridge\DependencyInjection\Compiler\RegisterHandlers;
30
use SimpleBus\SymfonyBridge\DependencyInjection\Compiler\RegisterMessageRecorders;
31
use SimpleBus\SymfonyBridge\DependencyInjection\Compiler\RegisterSubscribers;
32
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
33
use Symfony\Component\DependencyInjection\ContainerBuilder;
34
use Symfony\Component\DependencyInjection\Definition;
35
use Symfony\Component\DependencyInjection\Reference;
36
37
/**
38
 * Simple bus pass.
39
 *
40
 * @author Gorka Laucirica <[email protected]>
41
 * @author Beñat Espiña <[email protected]>
42
 */
43
class SimpleBusPass implements CompilerPassInterface
44
{
45
    /**
46
     * {@inheritdoc}
47
     */
48
    public function process(ContainerBuilder $container)
49
    {
50
        $config = $container->getParameter('bengor_file.config');
51
52
        foreach ($config['file_class'] as $key => $file) {
53
            $bundles = $container->getParameter('kernel.bundles');
54
            foreach ($bundles as $bundle) {
55
                $extension = (new $bundle())->getContainerExtension();
56
                if ($extension instanceof SimpleBusTaggerExtension) {
57
                    $container = $extension->addMiddlewareTags($container, $key);
58
                }
59
            }
60
            $this->commandBus($container, $key);
61
            $this->eventBus($container, $key);
62
        }
63
    }
64
65
    /**
66
     * Registers the command bus for given file.
67
     *
68
     * @param ContainerBuilder $container The container builder
69
     * @param string           $file      The file name
70
     */
71
    private function commandBus(ContainerBuilder $container, $file)
72
    {
73
        $busId = 'bengor.file.simple_bus_' . $file . '_command_bus';
74
        $middlewareTag = 'bengor_file_' . $file . '_command_bus_middleware';
75
        $handlerTag = 'bengor_file_' . $file . '_command_bus_handler';
76
77
        // Define the command bus for the given file type
78
        // The middleware tag string will be later used to add
79
        // required middleware to this specific command bus
80
        $container->setDefinition(
81
            $busId,
82
            (new Definition(
83
                MessageBusSupportingMiddleware::class
84
            ))->addTag('message_bus', [
85
                'type'           => 'command',
86
                'middleware_tag' => $middlewareTag,
87
            ])->setPublic(false)
88
        );
89
90
        // Find services tagged with $middlewareTag string and add
91
        // them to the current file type's command bus
92
        (new ConfigureMiddlewares($busId, $middlewareTag))->process($container);
93
94
        // Declares callable resolver for the current file type's command bus
95
        $container->setDefinition(
96
            'bengor_file.simple_bus_bridge_bundle.' . $file . '_command_bus.callable_resolver',
97
            (new Definition(
98
                ServiceLocatorAwareCallableResolver::class, [
99
                    [
100
                        new Reference('service_container'), 'get',
101
                    ],
102
                ]
103
            ))->setPublic(false)
104
        );
105
106
        // Declares class based command name resolver for the current file type's command bus
107
        $container->setDefinition(
108
            'bengor_file.simple_bus_bridge_bundle.' . $file . '_command_bus.class_based_command_name_resolver',
109
            (new Definition(
110
                ClassBasedNameResolver::class
111
            ))->setPublic(false)
112
        );
113
114
        // Declares the handler map for the current file type's command bus,
115
        // will contain the association between commands an handlers
116
        $container->setDefinition(
117
            'bengor_file.simple_bus_bridge_bundle.' . $file . '_command_bus.command_handler_map',
118
            (new Definition(
119
                CallableMap::class, [
120
                    [],
121
                    $container->getDefinition(
122
                        'bengor_file.simple_bus_bridge_bundle.' . $file . '_command_bus.callable_resolver'
123
                    ),
124
                ]
125
            ))->setPublic(false)
126
        );
127
128
        // Declares the handler resolver with the NameResolver
129
        // strategy and HandlerMap key values for Command => Handler
130
        $container->setDefinition(
131
            'bengor_file.simple_bus_bridge_bundle.' . $file . '_command_bus.command_handler_resolver',
132
            (new Definition(
133
                NameBasedMessageHandlerResolver::class, [
134
                    $container->getDefinition(
135
                        'bengor_file.simple_bus_bridge_bundle.' . $file . '_command_bus.class_based_command_name_resolver'
136
                    ),
137
                    $container->getDefinition(
138
                        'bengor_file.simple_bus_bridge_bundle.' . $file . '_command_bus.command_handler_map'
139
                    ),
140
                ]
141
            ))->setPublic(false)
142
        );
143
144
        // Declares the Handler
145
        $container
146
            ->findDefinition(
147
                'bengor_file.simple_bus_bridge_bundle.' . $file . '_command_bus.delegates_to_message_handler_middleware'
148
            )
149
            ->addArgument(
150
                $container->getDefinition(
151
                    'bengor_file.simple_bus_bridge_bundle.' . $file . '_command_bus.command_handler_resolver'
152
                )
153
            )->setPublic(false);
154
155
        // Declares the tag that will be used to associate the
156
        // handlers to the current file type's command bus
157
        (new RegisterHandlers(
158
            'bengor_file.simple_bus_bridge_bundle.' . $file . '_command_bus.command_handler_map',
159
            $handlerTag,
160
            'handles'
161
        ))->process($container);
162
163
        // Decorate SimpleBus' command bus with BenGorFile's command bus
164
        $container->setDefinition(
165
            'bengor_file.' . $file . '.command_bus',
166
            new Definition(
167
                SimpleBusFileCommandBus::class, [
168
                    $container->getDefinition($busId),
169
                ]
170
            )
171
        );
172
    }
173
174
    /**
175
     * Registers the event bus for given file.
176
     *
177
     * @param ContainerBuilder $container The container builder
178
     * @param string           $file      The file name
179
     */
180
    private function eventBus(ContainerBuilder $container, $file)
181
    {
182
        $busId = 'bengor.file.simple_bus_' . $file . '_event_bus';
183
        $middlewareTag = 'bengor_file_' . $file . '_event_bus_middleware';
184
        $subscriberTag = 'bengor_file_' . $file . '_event_subscriber';
185
186
        // Define the event bus for the given file type
187
        // The middleware tag string will be later used to add
188
        // required middleware to this specific event bus
189
        $container->setDefinition(
190
            $busId,
191
            (new Definition(
192
                MessageBusSupportingMiddleware::class
193
            ))->addTag('message_bus', [
194
                'type'           => 'event',
195
                'middleware_tag' => $middlewareTag,
196
            ])->setPublic(false)
197
        );
198
199
        // Find services tagged with $middlewareTag string and add
200
        // them to the current file type's event bus
201
        (new ConfigureMiddlewares($busId, $middlewareTag))->process($container);
202
203
        // Declares callable resolver for the current file type's event bus
204
        $container->setDefinition(
205
            'bengor_file.simple_bus_bridge_bundle.' . $file . '_event_bus.callable_resolver',
206
            (new Definition(
207
                ServiceLocatorAwareCallableResolver::class, [
208
                    [
209
                        new Reference('service_container'), 'get',
210
                    ],
211
                ]
212
            ))->setPublic(false)
213
        );
214
215
        // Declares class based event name resolver for the current file type's event bus
216
        $container->setDefinition(
217
            'bengor_file.simple_bus_bridge_bundle.' . $file . '_event_bus.class_based_event_name_resolver',
218
            (new Definition(
219
                ClassBasedNameResolver::class
220
            ))->setPublic(false)
221
        );
222
223
        // Declares the event subscribers collection for the current file type's event bus,
224
        // will contain the association between events an subscribers
225
        $container->setDefinition(
226
            'bengor_file.simple_bus_bridge_bundle.' . $file . '_event_bus.event_subscribers_collection',
227
            (new Definition(
228
                CallableCollection::class, [
229
                    [],
230
                    $container->getDefinition(
231
                        'bengor_file.simple_bus_bridge_bundle.' . $file . '_event_bus.callable_resolver'
232
                    ),
233
                ]
234
            ))->setPublic(false)
235
        );
236
237
        // Declares the subscriber resolver with the NameResolver
238
        // strategy and SubscriberCollection key values for Event => Subscriber
239
        $container->setDefinition(
240
            'bengor_file.simple_bus_bridge_bundle.' . $file . '_event_bus.event_subscribers_resolver',
241
            (new Definition(
242
                NameBasedMessageSubscriberResolver::class, [
243
                    $container->getDefinition(
244
                        'bengor_file.simple_bus_bridge_bundle.' . $file . '_event_bus.class_based_event_name_resolver'
245
                    ),
246
                    $container->getDefinition(
247
                        'bengor_file.simple_bus_bridge_bundle.' . $file . '_event_bus.event_subscribers_collection'
248
                    ),
249
                ]
250
            ))->setPublic(false)
251
        );
252
253
        // Declares the Subscriber
254
        $container
255
            ->findDefinition(
256
                'bengor_file.simple_bus_bridge_bundle.' . $file . '_event_bus.delegates_to_message_handler_middleware'
257
            )
258
            ->addArgument(
259
                $container->getDefinition(
260
                    'bengor_file.simple_bus_bridge_bundle.' . $file . '_event_bus.event_subscribers_resolver'
261
                )
262
            )->setPublic(false);
263
264
        // Declares the tag that will be used to associate the
265
        // subscribers to the current file type's event bus
266
        (new RegisterSubscribers(
267
            'bengor_file.simple_bus_bridge_bundle.' . $file . '_event_bus.event_subscribers_collection',
268
            $subscriberTag,
269
            'subscribes_to'
270
        ))->process($container);
271
272
        // Decorate SimpleBus' event bus with BenGorFile's event bus
273
        $container->setDefinition(
274
            'bengor_file.' . $file . '.event_bus',
275
            new Definition(
276
                SimpleBusFileEventBus::class, [
277
                    $container->getDefinition($busId),
278
                ]
279
            )
280
        );
281
282
        // All about aggregate recorded message
283
        $container->setDefinition(
284
            'bengor_file.simple_bus_bridge_bundle.' . $file . '_event_bus.aggregates_recorded_messages',
285
            new Definition(
286
                AggregatesRecordedMessages::class, [
287
                    [],
288
                ]
289
            )
290
        )->setPublic(false);
291
        $container
292
            ->findDefinition(
293
                'bengor_file.simple_bus_bridge_bundle.' . $file . '_event_bus.handles_recorded_messages_middleware'
294
            )
295
            ->setArguments([
296
                $container->getDefinition(
297
                    'bengor_file.simple_bus_bridge_bundle.' . $file . '_event_bus.aggregates_recorded_messages'
298
                ),
299
                $container->getDefinition($busId),
300
            ])->setPublic(false);
301
        (new RegisterMessageRecorders(
302
            'bengor_file.simple_bus_bridge_bundle.' . $file . '_event_bus.aggregates_recorded_messages',
303
            'event_recorder'
304
        ))->process($container);
305
306
        CompilerPassUtil::prependBeforeOptimizationPass(
307
            $container,
308
            new AddMiddlewareTags(
309
                'bengor_file.simple_bus_bridge_bundle.' . $file . '_event_bus.handles_recorded_messages_middleware',
310
                ['command'],
311
                200
312
            )
313
        );
314
    }
315
}
316