Passed
Push — master ( d093e3...81fa39 )
by Dāvis
03:13 queued 25s
created

Guzzle::processClientsConfiguration()   C

Complexity

Conditions 13
Paths 97

Size

Total Lines 66
Code Lines 39

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 13
eloc 39
nc 97
nop 3
dl 0
loc 66
rs 5.8968
c 0
b 0
f 0

How to fix   Long Method    Complexity   

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
namespace Sludio\HelperBundle\DependencyInjection\Component;
4
5
use Sludio\HelperBundle\DependencyInjection\Compiler\MiddlewarePass;
6
use Symfony\Component\DependencyInjection\ContainerBuilder;
7
use Symfony\Component\DependencyInjection\Definition;
8
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
9
use Symfony\Component\DependencyInjection\Reference;
10
use Sludio\HelperBundle\Script\Utils\Helper;
11
12
class Guzzle implements ConfigureInterface
13
{
14
    protected $alias;
15
16
    public function configure(ContainerBuilder &$container, $alias)
17
    {
18
        $this->alias = $alias.'.guzzle';
19
        $dataCollector = $container->getDefinition($this->alias.'.data_collector.guzzle');
20
        $dataCollector->replaceArgument(0, $container->getParameter($this->alias.'.profiler')['max_body_size']);
21
22
        if (!$container->getParameter($this->alias.'.profiler')['enabled']) {
23
            $container->removeDefinition($this->alias.'.middleware.history');
24
            $container->removeDefinition($this->alias.'.middleware.stopwatch');
25
            $container->removeDefinition($this->alias.'.data_collector.guzzle');
26
        }
27
28
        $this->processLoggerConfiguration($container->getParameter($this->alias.'.logger'), $container);
29
        $this->processMockConfiguration($container->getParameter($this->alias.'.mock'), $container, $container->getParameter($this->alias.'.profiler')['enabled']);
30
        $this->processCacheConfiguration($container->getParameter($this->alias.'.cache'), $container, $container->getParameter($this->alias.'.profiler')['enabled']);
31
        $this->processClientsConfiguration($container->getParameter($this->alias.'.clients'), $container, $container->getParameter($this->alias.'.profiler')['enabled']);
32
    }
33
34
    private function processLoggerConfiguration(array $config, ContainerBuilder $container)
35
    {
36
        if (!$config['enabled']) {
37
            $container->removeDefinition($this->alias.'.middleware.logger');
38
            $container->removeDefinition($this->alias.'.logger.message_formatter');
39
40
            return;
41
        }
42
43
        $loggerDefinition = $container->getDefinition($this->alias.'.middleware.logger');
44
45
        if ($config['service']) {
46
            $loggerDefinition->replaceArgument(0, new Reference($config['service']));
47
        }
48
49
        if ($config['format']) {
50
            $formatterDefinition = $container->getDefinition($this->alias.'.logger.message_formatter');
51
            $formatterDefinition->replaceArgument(0, $config['format']);
52
        }
53
54
        if ($config['level']) {
55
            $loggerDefinition->replaceArgument(2, $config['level']);
56
        }
57
    }
58
59
    private function processMockConfiguration(array $config, ContainerBuilder $container, $debug)
60
    {
61
        if (!$config['enabled']) {
62
            $container->removeDefinition($this->alias.'.middleware.mock');
63
            $container->removeDefinition($this->alias.'.mock.storage');
64
65
            return;
66
        }
67
68
        $storage = $container->getDefinition($this->alias.'.mock.storage');
69
        $storage->setArguments([
70
            $config['storage_path'],
71
            $config['request_headers_blacklist'],
72
            $config['response_headers_blacklist'],
73
        ]);
74
75
        $middleware = $container->getDefinition($this->alias.'.middleware.mock');
76
        $middleware->replaceArgument(1, $config['mode']);
77
        $middleware->replaceArgument(2, $debug);
78
    }
79
80
    private function processCacheConfiguration(array $config, ContainerBuilder $container, $debug)
81
    {
82
        if (!$config['enabled'] || $config['disabled'] === true) {
83
            $container->removeDefinition($this->alias.'.middleware.cache');
84
            $container->removeDefinition($this->alias.'.cache_adapter.redis');
85
86
            return;
87
        }
88
89
        $container->getDefinition($this->alias.'.middleware.cache')->addArgument($debug);
90
        $container->getDefinition($this->alias.'.redis_cache')
91
            ->replaceArgument(0, new Reference('snc_redis.'.$container->getParameter('sludio_helper.redis.guzzle')));
92
93
        $container->setAlias($this->alias.'.cache_adapter', $config['adapter']);
94
    }
95
96
    private function processClientsConfiguration(array $config, ContainerBuilder $container, $debug)
97
    {
98
        foreach ($config as $name => $options) {
99
            $client = new Definition($options['class']);
100
            $client->setLazy($options['lazy']);
101
            $useAuthentication = $options['credentials']['enabled'];
102
103
            if ($useAuthentication === true) {
104
                if (!Helper::multiset(array_values($options['credentials']))) {
105
                    throw new InvalidArgumentException(sprintf('If authentication parameter is set, htpasswd user and password can not be null'));
106
                }
107
                $credentials = [
108
                    'auth' => [
109
                        $options['credentials']['user'],
110
                        $options['credentials']['pass'],
111
                        $options['authentication_type'],
112
                    ],
113
                ];
114
115
                if (!isset($options['config'])) {
116
                    $options['config'] = $credentials;
117
                } else {
118
                    $options['config'] = array_merge($options['config'], $credentials);
119
                }
120
121
            }
122
123
            if (isset($options['config'])) {
124
                if (!is_array($options['config'])) {
125
                    throw new InvalidArgumentException(sprintf('Config for "'.$this->alias.'.client.%s" should be an array, but got %s', $name, gettype($options['config'])));
126
                }
127
                $client->addArgument($this->buildGuzzleConfig($options['config'], $debug));
128
            }
129
130
            $attributes = [];
131
132
            if (!empty($options['middleware'])) {
133
                if ($debug) {
134
                    $addDebugMiddleware = true;
135
136
                    foreach ($options['middleware'] as $middleware) {
137
                        if ('!' === $middleware[0]) {
138
                            $addDebugMiddleware = false;
139
                            break;
140
                        }
141
                    }
142
143
                    if ($addDebugMiddleware) {
144
                        $options['middleware'] = array_merge($options['middleware'], [
145
                            'stopwatch',
146
                            'history',
147
                            'logger',
148
                        ]);
149
                    }
150
                }
151
152
                $attributes['middleware'] = implode(' ', array_unique($options['middleware']));
153
            }
154
155
            $client->addTag(MiddlewarePass::CLIENT_TAG, $attributes);
156
157
            $clientServiceId = sprintf($this->alias.'.client.%s', $name);
158
            $container->setDefinition($clientServiceId, $client);
159
160
            if (isset($options['alias'])) {
161
                $container->setAlias($options['alias'], $clientServiceId);
162
            }
163
        }
164
    }
165
166
    private function buildGuzzleConfig(array $config, $debug)
167
    {
168
        if (isset($config['handler'])) {
169
            $config['handler'] = new Reference($config['handler']);
170
        }
171
172
        if ($debug && function_exists('curl_init')) {
173
            $config['on_stats'] = [
174
                new Reference($this->alias.'.data_collector.history_bag'),
175
                'addStats',
176
            ];
177
        }
178
179
        return $config;
180
    }
181
}
182