ElasticaExtension   A
last analyzed

Complexity

Total Complexity 14

Size/Duplication

Total Lines 119
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 8

Test Coverage

Coverage 84.48%

Importance

Changes 0
Metric Value
wmc 14
lcom 1
cbo 8
dl 0
loc 119
ccs 49
cts 58
cp 0.8448
rs 10
c 0
b 0
f 0

7 Methods

Rating   Name   Duplication   Size   Complexity  
A loadLogger() 0 12 2
A createLoggerReference() 0 11 2
A load() 0 16 1
A loadClients() 0 6 2
A loadClient() 0 14 1
B setupAutowire() 0 24 5
A createClientId() 0 4 1
1
<?php
2
3
namespace GBProd\ElasticaBundle\DependencyInjection;
4
5
use Elastica\Client;
6
use GBProd\ElasticaBundle\Logger\ElasticaLogger;
7
use Symfony\Component\Config\FileLocator;
8
use Symfony\Component\DependencyInjection\ContainerBuilder;
9
use Symfony\Component\DependencyInjection\ContainerInterface;
10
use Symfony\Component\DependencyInjection\Exception\LogicException;
11
use Symfony\Component\DependencyInjection\Loader;
12
use Symfony\Component\DependencyInjection\Reference;
13
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
14
15
/**
16
 * Extension class for ElasticaExtension
17
 *
18
 * @author gbprod <[email protected]>
19
 */
20
class ElasticaExtension extends Extension
21
{
22
    const CLIENT_ID_TEMPLATE = 'elastica.%s_client';
23
24
    /**
25
     * {@inheritdoc}
26
     */
27 7
    public function load(array $configs, ContainerBuilder $container)
28
    {
29 7
        $configuration = new Configuration();
30 7
        $config = $this->processConfiguration($configuration, $configs);
31
32 7
        $loader = new Loader\YamlFileLoader(
33 7
            $container,
34 7
            new FileLocator(__DIR__ . '/../Resources/config')
35 7
        );
36
37 7
        $loader->load('services.yml');
38
39 7
        $this->loadLogger($config, $container);
40 7
        $this->loadClients($config, $container);
41 7
        $this->setupAutowire($config, $container);
42 7
    }
43
44 7
    private function loadLogger(array $config, ContainerBuilder $container)
45
    {
46
        $definition = $container
47 7
            ->register('elastica.logger', ElasticaLogger::class)
48 7
            ->addArgument($this->createLoggerReference($config))
49 7
            ->addArgument('%kernel.debug%')
50 7
            ->setPublic(true);
51
52 7
        if ('logger' === $config['logger']) {
53 5
            $definition->addTag('monolog.logger', ['channel' => 'elastica']);
54 5
        }
55 7
    }
56
57 7
    private function createLoggerReference(array $config)
58
    {
59 7
        if (null !== $config['logger']) {
60 6
            return new Reference(
61 6
                $config['logger'],
62
                ContainerInterface::IGNORE_ON_INVALID_REFERENCE
63 6
            );
64
        }
65
66 1
        return null;
67
    }
68
69
    /**
70
     * @param array $config
71
     * @param ContainerBuilder $container
72
     */
73 7
    private function loadClients(array $config, ContainerBuilder $container)
74
    {
75 7
        foreach ($config['clients'] as $clientName => $clientConfig) {
76 2
            $this->loadClient($clientName, $clientConfig, $container);
77 7
        }
78 7
    }
79
80
    /**
81
     * @param string $clientName
82
     * @param array $clientConfig
83
     * @param ContainerBuilder $container
84
     */
85 2
    private function loadClient($clientName, array $clientConfig, ContainerBuilder $container)
86
    {
87
        $container
88 2
            ->register($this->createClientId($clientName), Client::class)
89 2
            ->addArgument($clientConfig)
90 2
            ->addMethodCall('setLogger', [
91 2
                new Reference('elastica.logger')
92 2
            ])
93 2
            ->addMethodCall('setConfigValue', [
94 2
                'log',
95 2
                $container->getParameter('kernel.debug')
96 2
            ])
97 2
            ->setPublic(true);
98 2
    }
99
100
    /**
101
     * Configure service auto-wiring for default Elastica client
102
     * for Symfony 3.3+
103
     *
104
     * @param array $config
105
     * @param ContainerBuilder $container
106
     *
107
     * @throws LogicException
108
     */
109 7
    private function setupAutowire(array $config, ContainerBuilder $container)
110
    {
111 7
        if (!method_exists($container, 'autowire')) {
112
            // This container have no support for services auto-wiring
113 7
            return;
114
        }
115
116
        if (!$config['autowire']) {
117
            // Auto-wiring for default client is explicitly disabled
118
            return;
119
        }
120
121
        if (!array_key_exists('default', $config['clients'])) {
122
            // No "default" client is available
123
            return;
124
        }
125
126
        if ($container->hasDefinition(Client::class)) {
127
            throw new LogicException('Default Elasticsearch client autowiring setup is enabled, ' .
128
                'but Elastica client service is already defined in container');
129
        }
130
131
        $container->setAlias(Client::class, $this->createClientId('default'));
132
    }
133
134 2
    private function createClientId($clientName)
135
    {
136 2
        return sprintf(self::CLIENT_ID_TEMPLATE, $clientName);
137
    }
138
}
139