Passed
Push — master ( b0f8c9...462be0 )
by Sébastien
03:24
created

BdfQueueExtension   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 123
Duplicated Lines 0 %

Test Coverage

Coverage 96.72%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 52
c 2
b 0
f 0
dl 0
loc 123
ccs 59
cts 61
cp 0.9672
rs 10
wmc 12

6 Methods

Rating   Name   Duplication   Size   Complexity  
A load() 0 11 1
A configureFailer() 0 8 1
A configureDestinations() 0 29 5
A getConfiguration() 0 3 1
A configureSerializer() 0 7 2
A configureConnections() 0 28 2
1
<?php
2
3
namespace Bdf\QueueBundle\DependencyInjection;
4
5
use Bdf\Queue\Connection\ConnectionDriverInterface;
6
use Bdf\QueueBundle\ConnectionFactory\Configuration as DriverConfiguration;
7
use Bdf\QueueBundle\ConnectionFactory\ConnectionDriverConfiguratorInterface;
8
use Bdf\QueueBundle\ConnectionFactory\ConnectionDriverFactory;
9
use Bdf\QueueBundle\Consumption\ReceiverFactoryProviderInterface;
10
use Bdf\QueueBundle\DependencyInjection\Compiler\DriverFactoryPass;
11
use Bdf\QueueBundle\DependencyInjection\Compiler\RegisterFailerDriverPass;
12
use Bdf\QueueBundle\DependencyInjection\Compiler\RegisterReceiverFactoryPass;
13
use Bdf\QueueBundle\DependencyInjection\Failer\FailerDriverConfiguratorInterface;
14
use Symfony\Component\Config\FileLocator;
15
use Symfony\Component\DependencyInjection\ContainerBuilder;
16
use Symfony\Component\DependencyInjection\Extension\Extension;
17
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
18
use Symfony\Component\DependencyInjection\Reference;
19
20
/**
21
 * QueueExtension
22
 */
23
class BdfQueueExtension extends Extension
24
{
25
    /**
26
     * {@inheritDoc}
27
     */
28 7
    public function load(array $configs, ContainerBuilder $container)
29
    {
30 7
        $configuration = $this->getConfiguration($configs, $container);
31 7
        $config = $this->processConfiguration($configuration, $configs);
32
33 7
        $loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
34 7
        $loader->load('queue.yaml');
35
36 7
        $this->configureConnections($config, $container);
37 7
        $this->configureDestinations($config, $container);
38 7
        $this->configureFailer($config, $container);
39 7
    }
40
41
    /**
42
     * @param array $config
43
     * @param ContainerBuilder $container
44
     */
45 7
    public function configureConnections(array $config, ContainerBuilder $container): void
46
    {
47 7
        $connectionConfigs = [];
48
49 7
        foreach ($config['connections'] as $name => $options) {
50 7
            $connectionConfigs[$name] = $options;
51
52 7
            $container->register('bdf_queue.config_definition.'.$name, DriverConfiguration::class)
53 7
                ->setFactory([DriverConfiguration::class, 'createConfiguration'])
54 7
                ->setArguments([$name, $options]);
55
56 7
            $container->register('bdf_queue.connection_definition.'.$name, ConnectionDriverInterface::class)
57 7
                ->setPublic(true)
58 7
                ->setFactory($options['connection_factory'] ?? [new Reference(ConnectionDriverFactory::class), 'createDriver'])
59 7
                ->setArguments([
60 7
                    new Reference('bdf_queue.config_definition.'.$name),
61 7
                    new Reference($this->configureSerializer($options['serializer'], $config['default_serializer']))
62
                ]);
63
        }
64
65 7
        $container->registerForAutoconfiguration(ConnectionDriverConfiguratorInterface::class)
66 7
            ->setShared(false)
67 7
            ->setPublic(false)
68 7
            ->addTag(DriverFactoryPass::CONFIGURATOR_TAG_NAME);
69
70 7
        $container->setParameter('bdf_queue.default_connection', $config['default_connection'] ?? key($connectionConfigs));
71 7
        $container->setParameter('bdf_queue.connections', $connectionConfigs);
72 7
        $container->setParameter('bdf_queue.connection_names', array_keys($connectionConfigs));
73 7
    }
74
75
    /**
76
     * @param array $config
77
     * @param string $default
78
     *
79
     * @return string
80
     */
81 7
    private function configureSerializer(array $config, string $default): string
82
    {
83 7
        if (isset($config['service'])) {
84
            return $config['service'];
85
        }
86
87 7
        return 'bdf_queue.serializer.'.($config['id'] ?? $default);
88
    }
89
90
    /**
91
     * @param array $config
92
     * @param ContainerBuilder $container
93
     */
94 7
    public function configureDestinations(array $config, ContainerBuilder $container): void
95
    {
96 7
        $destinations = [];
97 7
        $consumptionConfig = [];
98
99 7
        foreach ($config['destinations'] as $name => $options) {
100 6
            $destinations[$name] = $options['url'];
101
102
            // TODO build a builder rule in the container for this destination
103 6
            foreach ($options['consumer'] as $option => $value) {
104 6
                if ($value !== null) {
105 6
                    if (($value[0] ?? '') === '@') {
106
                        $value = new Reference(ltrim($value, '@'));
107
                    }
108
109 6
                    $consumptionConfig[$name][$option] = $value;
110
                }
111
            }
112
        }
113
114 7
        $container->registerForAutoconfiguration(ReceiverFactoryProviderInterface::class)
115 7
            ->setShared(false)
116 7
            ->setPublic(false)
117 7
            ->addTag(RegisterReceiverFactoryPass::CONFIGURATOR_TAG_NAME);
118
119 7
        $container->getDefinition('bdf_queue.receiver.loader')
120 7
            ->replaceArgument(1, $consumptionConfig);
121
122 7
        $container->setParameter('bdf_queue.destinations', $destinations);
123 7
    }
124
125
    /**
126
     * @param array $config
127
     * @param ContainerBuilder $container
128
     */
129 7
    public function configureFailer(array $config, ContainerBuilder $container): void
130
    {
131 7
        $container->setParameter('bdf_queue.failer_dsn', $config['failer']);
132
133 7
        $container->registerForAutoconfiguration(FailerDriverConfiguratorInterface::class)
134 7
            ->setShared(false)
135 7
            ->setPublic(false)
136 7
            ->addTag(RegisterFailerDriverPass::CONFIGURATOR_TAG_NAME)
137
        ;
138 7
    }
139
140
    /**
141
     * {@inheritDoc}
142
     */
143 7
    public function getConfiguration(array $config, ContainerBuilder $container): Configuration
144
    {
145 7
        return new Configuration($container->getParameter('kernel.debug'));
146
    }
147
}
148