SimpleBusPass::eventBus()   B
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 135
Code Lines 80

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 135
rs 8.2857
c 0
b 0
f 0
cc 1
eloc 80
nc 1
nop 2

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/*
4
 * This file is part of the BenGorUser 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 BenGorUser\SimpleBusBridgeBundle\DependencyInjection\Compiler;
14
15
use BenGorUser\SimpleBusBridge\CommandBus\SimpleBusUserCommandBus;
16
use BenGorUser\SimpleBusBridge\EventBus\SimpleBusUserEventBus;
17
use BenGorUser\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_user.config');
51
52
        foreach ($config['user_class'] as $key => $user) {
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->commandBus($container, $key, true);
62
            $this->eventBus($container, $key);
63
        }
64
    }
65
66
    /**
67
     * Registers the command bus for given user.
68
     *
69
     * @param ContainerBuilder $container The container builder
70
     * @param string           $user      The user name
71
     * @param bool             $isApi     Flag that tells if it is api version or not
72
     */
73
    private function commandBus(ContainerBuilder $container, $user, $isApi = false)
74
    {
75
        $apiPartName = $isApi ? '_api' : '';
76
        $busId = 'bengor.user.simple_bus_' . $user . $apiPartName . '_command_bus';
77
        $middlewareTag = 'bengor_user_' . $user . '_command_bus_middleware';
78
        $handlerTag = 'bengor_user_' . $user . $apiPartName . '_command_bus_handler';
79
80
        // Define the command bus for the given user type
81
        // The middleware tag string will be later used to add
82
        // required middleware to this specific command bus
83
        $container->setDefinition(
84
            $busId,
85
            (new Definition(
86
                MessageBusSupportingMiddleware::class
87
            ))->addTag('message_bus', [
88
                'type'           => 'command',
89
                'middleware_tag' => $middlewareTag,
90
            ])->setPublic(false)
91
        );
92
93
        // Find services tagged with $middlewareTag string and add
94
        // them to the current user type's command bus
95
        (new ConfigureMiddlewares($busId, $middlewareTag))->process($container);
96
97
        // Declares callable resolver for the current user type's command bus
98
        $container->setDefinition(
99
            'bengor_user.simple_bus_bridge_bundle.' . $user . '_command_bus.callable_resolver',
100
            (new Definition(
101
                ServiceLocatorAwareCallableResolver::class, [
102
                    [
103
                        new Reference('service_container'), 'get',
104
                    ],
105
                ]
106
            ))->setPublic(false)
107
        );
108
109
        // Declares class based command name resolver for the current user type's command bus
110
        $container->setDefinition(
111
            'bengor_user.simple_bus_bridge_bundle.' . $user . '_command_bus.class_based_command_name_resolver',
112
            (new Definition(
113
                ClassBasedNameResolver::class
114
            ))->setPublic(false)
115
        );
116
117
        // Declares the handler map for the current user type's command bus,
118
        // will contain the association between commands an handlers
119
        $container->setDefinition(
120
            'bengor_user.simple_bus_bridge_bundle.' . $user . '_command_bus.command_handler_map',
121
            (new Definition(
122
                CallableMap::class, [
123
                    [],
124
                    $container->getDefinition(
125
                        'bengor_user.simple_bus_bridge_bundle.' . $user . '_command_bus.callable_resolver'
126
                    ),
127
                ]
128
            ))->setPublic(false)
129
        );
130
131
        // Declares the handler resolver with the NameResolver
132
        // strategy and HandlerMap key values for Command => Handler
133
        $container->setDefinition(
134
            'bengor_user.simple_bus_bridge_bundle.' . $user . '_command_bus.command_handler_resolver',
135
            (new Definition(
136
                NameBasedMessageHandlerResolver::class, [
137
                    $container->getDefinition(
138
                        'bengor_user.simple_bus_bridge_bundle.' . $user . '_command_bus.class_based_command_name_resolver'
0 ignored issues
show
Coding Style introduced by
This line exceeds maximum limit of 120 characters; contains 122 characters

Overly long lines are hard to read on any screen. Most code styles therefor impose a maximum limit on the number of characters in a line.

Loading history...
139
                    ),
140
                    $container->getDefinition(
141
                        'bengor_user.simple_bus_bridge_bundle.' . $user . '_command_bus.command_handler_map'
142
                    ),
143
                ]
144
            ))->setPublic(false)
145
        );
146
147
        // Declares the Handler
148
        $container
149
            ->findDefinition(
150
                'bengor_user.simple_bus_bridge_bundle.' . $user . '_command_bus.delegates_to_message_handler_middleware'
151
            )
152
            ->addArgument(
153
                $container->getDefinition(
154
                    'bengor_user.simple_bus_bridge_bundle.' . $user . '_command_bus.command_handler_resolver'
155
                )
156
            )->setPublic(false);
157
158
        // Declares the tag that will be used to associate the
159
        // handlers to the current user type's command bus
160
        (new RegisterHandlers(
161
            'bengor_user.simple_bus_bridge_bundle.' . $user . '_command_bus.command_handler_map',
162
            $handlerTag,
163
            'handles'
164
        ))->process($container);
165
166
        // Decorate SimpleBus' command bus with BenGorUser's command bus
167
168
        $apiPartName = $isApi ? '.api_' : '.';
169
        $container->setDefinition(
170
            'bengor_user.' . $user . $apiPartName . 'command_bus',
171
            new Definition(
172
                SimpleBusUserCommandBus::class, [
173
                    $container->getDefinition($busId),
174
                ]
175
            )
176
        );
177
    }
178
179
    /**
180
     * Registers the event bus for given user.
181
     *
182
     * @param ContainerBuilder $container The container builder
183
     * @param string           $user      The user name
184
     */
185
    private function eventBus(ContainerBuilder $container, $user)
186
    {
187
        $busId = 'bengor.user.simple_bus_' . $user . '_event_bus';
188
        $middlewareTag = 'bengor_user_' . $user . '_event_bus_middleware';
189
        $subscriberTag = 'bengor_user_' . $user . '_event_subscriber';
190
191
        // Define the event bus for the given user type
192
        // The middleware tag string will be later used to add
193
        // required middleware to this specific event bus
194
        $container->setDefinition(
195
            $busId,
196
            (new Definition(
197
                MessageBusSupportingMiddleware::class
198
            ))->addTag('message_bus', [
199
                'type'           => 'event',
200
                'middleware_tag' => $middlewareTag,
201
            ])->setPublic(false)
202
        );
203
204
        // Find services tagged with $middlewareTag string and add
205
        // them to the current user type's event bus
206
        (new ConfigureMiddlewares($busId, $middlewareTag))->process($container);
207
208
        // Declares callable resolver for the current user type's event bus
209
        $container->setDefinition(
210
            'bengor_user.simple_bus_bridge_bundle.' . $user . '_event_bus.callable_resolver',
211
            (new Definition(
212
                ServiceLocatorAwareCallableResolver::class, [
213
                    [
214
                        new Reference('service_container'), 'get',
215
                    ],
216
                ]
217
            ))->setPublic(false)
218
        );
219
220
        // Declares class based event name resolver for the current user type's event bus
221
        $container->setDefinition(
222
            'bengor_user.simple_bus_bridge_bundle.' . $user . '_event_bus.class_based_event_name_resolver',
223
            (new Definition(
224
                ClassBasedNameResolver::class
225
            ))->setPublic(false)
226
        );
227
228
        // Declares the event subscribers collection for the current user type's event bus,
229
        // will contain the association between events an subscribers
230
        $container->setDefinition(
231
            'bengor_user.simple_bus_bridge_bundle.' . $user . '_event_bus.event_subscribers_collection',
232
            (new Definition(
233
                CallableCollection::class, [
234
                    [],
235
                    $container->getDefinition(
236
                        'bengor_user.simple_bus_bridge_bundle.' . $user . '_event_bus.callable_resolver'
237
                    ),
238
                ]
239
            ))->setPublic(false)
240
        );
241
242
        // Declares the subscriber resolver with the NameResolver
243
        // strategy and SubscriberCollection key values for Event => Subscriber
244
        $container->setDefinition(
245
            'bengor_user.simple_bus_bridge_bundle.' . $user . '_event_bus.event_subscribers_resolver',
246
            (new Definition(
247
                NameBasedMessageSubscriberResolver::class, [
248
                    $container->getDefinition(
249
                        'bengor_user.simple_bus_bridge_bundle.' . $user . '_event_bus.class_based_event_name_resolver'
250
                    ),
251
                    $container->getDefinition(
252
                        'bengor_user.simple_bus_bridge_bundle.' . $user . '_event_bus.event_subscribers_collection'
253
                    ),
254
                ]
255
            ))->setPublic(false)
256
        );
257
258
        // Declares the Subscriber
259
        $container
260
            ->findDefinition(
261
                'bengor_user.simple_bus_bridge_bundle.' . $user . '_event_bus.delegates_to_message_handler_middleware'
262
            )
263
            ->addArgument(
264
                $container->getDefinition(
265
                    'bengor_user.simple_bus_bridge_bundle.' . $user . '_event_bus.event_subscribers_resolver'
266
                )
267
            )->setPublic(false);
268
269
        // Declares the tag that will be used to associate the
270
        // subscribers to the current user type's event bus
271
        (new RegisterSubscribers(
272
            'bengor_user.simple_bus_bridge_bundle.' . $user . '_event_bus.event_subscribers_collection',
273
            $subscriberTag,
274
            'subscribes_to'
275
        ))->process($container);
276
277
        // Decorate SimpleBus' event bus with BenGorUser's event bus
278
        $container->setDefinition(
279
            'bengor_user.' . $user . '.event_bus',
280
            new Definition(
281
                SimpleBusUserEventBus::class, [
282
                    $container->getDefinition($busId),
283
                ]
284
            )
285
        );
286
287
        // All about aggregate recorded message
288
        $container->setDefinition(
289
            'bengor_user.simple_bus_bridge_bundle.' . $user . '_event_bus.aggregates_recorded_messages',
290
            new Definition(
291
                AggregatesRecordedMessages::class, [
292
                    [],
293
                ]
294
            )
295
        )->setPublic(false);
296
        $container
297
            ->findDefinition(
298
                'bengor_user.simple_bus_bridge_bundle.' . $user . '_event_bus.handles_recorded_messages_middleware'
299
            )
300
            ->setArguments([
301
                $container->getDefinition(
302
                    'bengor_user.simple_bus_bridge_bundle.' . $user . '_event_bus.aggregates_recorded_messages'
303
                ),
304
                $container->getDefinition($busId),
305
            ])->setPublic(false);
306
        (new RegisterMessageRecorders(
307
            'bengor_user.simple_bus_bridge_bundle.' . $user . '_event_bus.aggregates_recorded_messages',
308
            'event_recorder'
309
        ))->process($container);
310
311
        CompilerPassUtil::prependBeforeOptimizationPass(
312
            $container,
313
            new AddMiddlewareTags(
314
                'bengor_user.simple_bus_bridge_bundle.' . $user . '_event_bus.handles_recorded_messages_middleware',
315
                ['command'],
316
                200
317
            )
318
        );
319
    }
320
}
321