Passed
Push — master ( a51f35...a51f35 )
by Dāvis
05:00
created

Guzzle::processClientsConfiguration()   C

Complexity

Conditions 13
Paths 101

Size

Total Lines 69
Code Lines 40

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 13
eloc 40
nc 101
nop 3
dl 0
loc 69
rs 5.6694
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 Sludio\HelperBundle\Script\Utils\Helper;
7
use Symfony\Component\DependencyInjection\ContainerBuilder;
8
use Symfony\Component\DependencyInjection\Definition;
9
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
10
use Symfony\Component\DependencyInjection\Reference;
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
                    /** @var $options array[] */
137
                    foreach ($options['middleware'] as $middleware) {
138
                        if ('!' === $middleware[0]) {
139
                            $addDebugMiddleware = false;
140
                            break;
141
                        }
142
                    }
143
144
                    if ($addDebugMiddleware) {
145
                        $middleware = [
146
                            'stopwatch',
147
                            'history',
148
                            'logger',
149
                        ];
150
                        $options['middleware'] = array_merge($options['middleware'], $middleware);
151
                    }
152
                }
153
154
                $attributes['middleware'] = implode(' ', array_unique($options['middleware']));
155
            }
156
157
            $client->addTag(MiddlewarePass::CLIENT_TAG, $attributes);
158
159
            $clientServiceId = sprintf($this->alias.'.client.%s', $name);
160
            $container->setDefinition($clientServiceId, $client);
161
162
            /** @var $options array */
163
            if (isset($options['alias'])) {
164
                $container->setAlias($options['alias'], $clientServiceId);
165
            }
166
        }
167
    }
168
169
    private function buildGuzzleConfig(array $config, $debug)
170
    {
171
        if (isset($config['handler'])) {
172
            $config['handler'] = new Reference($config['handler']);
173
        }
174
175
        if ($debug && \function_exists('curl_init')) {
176
            $config['on_stats'] = [
177
                new Reference($this->alias.'.data_collector.history_bag'),
178
                'addStats',
179
            ];
180
        }
181
182
        return $config;
183
    }
184
}
185