Req2CmdExtension::configureExtractors()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 9
rs 9.6666
c 0
b 0
f 0
cc 2
eloc 5
nc 2
nop 2
1
<?php
2
declare(strict_types=1);
3
4
namespace Eps\Req2CmdBundle\DependencyInjection;
5
6
use Symfony\Component\Config\FileLocator;
7
use Symfony\Component\DependencyInjection\ContainerBuilder;
8
use Symfony\Component\DependencyInjection\Extension\Extension;
9
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
10
use Symfony\Component\DependencyInjection\Reference;
11
12
final class Req2CmdExtension extends Extension
13
{
14
    /**
15
     * {@inheritdoc}
16
     * @throws \Exception
17
     */
18
    public function load(array $configs, ContainerBuilder $container): void
19
    {
20
        $configuration = new Req2CmdConfiguration();
21
        $config = $this->processConfiguration($configuration, $configs);
22
23
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
24
25
        $loader->load('actions.xml');
26
        $loader->load('extractors.xml');
27
        $loader->load('listeners.xml');
28
        $loader->load('param_mappers.xml');
29
        $loader->load('command_bus.xml');
30
        $loader->load('serializer.xml');
31
32
        $this->configureExtractors($config, $container);
33
        $this->configureCommandBus($config, $container);
34
        $this->configureEventListeners($config, $container);
35
    }
36
37
    public function getAlias(): string
38
    {
39
        return 'req2cmd';
40
    }
41
42
    private function configureExtractors(array $config, ContainerBuilder $container): void
43
    {
44
        $extractorId = (string)$config['extractor']['service_id'];
45
        $container->setAlias('eps.req2cmd.extractor', $extractorId);
46
47
        if (!$config['extractor']['use_cmd_denormalizer']) {
48
            $container->removeDefinition('eps.req2cmd.normalizer.deserializable_command_denormalizer');
49
        }
50
    }
51
52
    private function configureCommandBus(array $config, ContainerBuilder $container): void
53
    {
54
        $commandBusId = (string)$config['command_bus']['service_id'];
55
        if ($commandBusId === 'eps.req2cmd.command_bus.tactician') {
56
            $busName = (string)$config['command_bus']['name'];
57
            $tacticianServiceName = 'tactician.commandbus.' . $busName;
58
            $busDefinition = $container->findDefinition('eps.req2cmd.command_bus.tactician');
59
            $busDefinition->replaceArgument(0, new Reference($tacticianServiceName));
60
        }
61
62
        $container->setAlias('eps.req2cmd.command_bus', $commandBusId);
63
    }
64
65
    private function configureEventListeners(array $config, ContainerBuilder $container): void
66
    {
67
        foreach ((array)$config['listeners'] as $listenerName => $listenerConfig) {
68
            $listenerId = $this->getListenerSvcIdByAlias($listenerName);
69
70
            if (!$listenerConfig['enabled']) {
71
                $container->removeDefinition($listenerId);
72
                continue;
73
            }
74
75
            $this->configureEventListener($container, $listenerId, $listenerConfig);
76
        }
77
    }
78
79
    private function configureEventListener(ContainerBuilder $container, string $listenerId, array $listenerCfg): void
80
    {
81
        $definition = $container->findDefinition($listenerId);
82
        $serviceTags = $definition->getTags();
83
84
        array_walk(
85
            $serviceTags['kernel.event_listener'],
86
            function (&$tag) use ($listenerCfg) {
87
                $tag['priority'] = $listenerCfg['priority'];
88
            }
89
        );
90
91
        $definition->setTags($serviceTags);
92
    }
93
94
    private function getListenerSvcIdByAlias(string $alias): string
95
    {
96
        $listenersMap = [
97
            'extractor' => 'eps.req2cmd.listener.extract_command'
98
        ];
99
100
        return $listenersMap[$alias];
101
    }
102
}
103