Passed
Pull Request — master (#2)
by Vincent
04:15 queued 01:21
created

BdfQueueExtension   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 117
Duplicated Lines 0 %

Test Coverage

Coverage 79.63%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 45
c 2
b 0
f 0
dl 0
loc 117
ccs 43
cts 54
cp 0.7963
rs 10
wmc 13

6 Methods

Rating   Name   Duplication   Size   Complexity  
A load() 0 12 1
A configureFailer() 0 13 2
A configureDestinations() 0 24 5
A getConfiguration() 0 3 1
A configureSerializer() 0 7 2
A configureConnections() 0 22 2
1
<?php
2
3
namespace Bdf\QueueBundle\DependencyInjection;
4
5
use Bdf\Queue\Connection\ConnectionDriverInterface;
6
use Bdf\Queue\Failer\DbFailedJobStorage;
0 ignored issues
show
Bug introduced by
The type Bdf\Queue\Failer\DbFailedJobStorage was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

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