Completed
Push — master ( 6e042e...aa76b0 )
by Dominik
04:51
created

getDbsOptionsInitializerDefinition()   B

Complexity

Conditions 7
Paths 1

Size

Total Lines 37

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 19
CRAP Score 7

Importance

Changes 0
Metric Value
dl 0
loc 37
ccs 19
cts 19
cp 1
rs 8.3946
c 0
b 0
f 0
cc 7
nc 1
nop 1
crap 7
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Chubbyphp\ServiceProvider;
6
7
use Chubbyphp\ServiceProvider\Logger\DoctrineDbalLogger;
8
use Doctrine\Common\Cache\ApcuCache;
9
use Doctrine\Common\Cache\ArrayCache;
10
use Doctrine\Common\EventManager;
11
use Doctrine\DBAL\Configuration;
12
use Doctrine\DBAL\DriverManager;
13
use Pimple\Container;
14
use Pimple\ServiceProviderInterface;
15
use Doctrine\DBAL\Types\Type;
16
17
final class DoctrineDbalServiceProvider implements ServiceProviderInterface
18
{
19
    /**
20
     * @param Container $container
21
     */
22 3
    public function register(Container $container)
23
    {
24 3
        $container['doctrine.dbal.db'] = $this->getDbDefinition($container);
25 3
        $container['doctrine.dbal.db.cache_factory.apcu'] = $this->getDbApcuCacheFactoryDefinition($container);
26 3
        $container['doctrine.dbal.db.cache_factory.array'] = $this->getDbArrayCacheFactoryDefinition($container);
27 3
        $container['doctrine.dbal.db.config'] = $this->getDbConfigDefinition($container);
28 3
        $container['doctrine.dbal.db.default_options'] = $this->getDbDefaultOptions();
29 3
        $container['doctrine.dbal.db.event_manager'] = $this->getDbEventManagerDefinition($container);
30 3
        $container['doctrine.dbal.dbs'] = $this->getDbsDefinition($container);
31 3
        $container['doctrine.dbal.dbs.config'] = $this->getDbsConfigDefinition($container);
32 3
        $container['doctrine.dbal.dbs.event_manager'] = $this->getDbsEventManagerDefinition($container);
33 3
        $container['doctrine.dbal.dbs.options.initializer'] = $this->getDbsOptionsInitializerDefinition($container);
34 3
        $container['doctrine.dbal.types'] = [];
35 3
    }
36
37
    /**
38
     * @param Container $container
39
     *
40
     * @return callable
41
     */
42
    private function getDbDefinition(Container $container): callable
43
    {
44 3
        return function () use ($container) {
45 2
            $dbs = $container['doctrine.dbal.dbs'];
46
47 2
            return $dbs[$container['doctrine.dbal.dbs.default']];
48 3
        };
49
    }
50
51
    /**
52
     * @param Container $container
53
     *
54
     * @return callable
55
     */
56
    private function getDbApcuCacheFactoryDefinition(Container $container): callable
57
    {
58 3
        return $container->factory(function () use ($container) {
59 1
            return new ApcuCache();
60 3
        });
61
    }
62
63
    /**
64
     * @param Container $container
65
     *
66
     * @return callable
67
     */
68
    private function getDbArrayCacheFactoryDefinition(Container $container): callable
69
    {
70 3
        return $container->factory(function () use ($container) {
71 2
            return new ArrayCache();
72 3
        });
73
    }
74
75
    /**
76
     * @param Container $container
77
     *
78
     * @return callable
79
     */
80
    private function getDbConfigDefinition(Container $container): callable
81
    {
82 3
        return function () use ($container) {
83 3
            $dbs = $container['doctrine.dbal.dbs.config'];
84
85 3
            return $dbs[$container['doctrine.dbal.dbs.default']];
86 3
        };
87
    }
88
89
    /**
90
     * @return array
91
     */
92 3
    private function getDbDefaultOptions(): array
93
    {
94
        return [
95 3
            'configuration' => [
96
                'auto_commit' => true,
97
                'cache.result' => 'array',
98
                'filter_schema_assets_expression' => null,
99
            ],
100
            'connection' => [
101
                'charset' => 'utf8mb4',
102
                'dbname' => null,
103
                'driver' => 'pdo_mysql',
104
                'host' => 'localhost',
105
                'password' => null,
106
                'path' => null,
107
                'port' => 3306,
108
                'user' => 'root',
109
            ],
110
        ];
111
    }
112
113
    /**
114
     * @param Container $container
115
     *
116
     * @return callable
117
     */
118
    private function getDbEventManagerDefinition(Container $container): callable
119
    {
120 3
        return function () use ($container) {
121 3
            $dbs = $container['doctrine.dbal.dbs.event_manager'];
122
123 3
            return $dbs[$container['doctrine.dbal.dbs.default']];
124 3
        };
125
    }
126
127
    /**
128
     * @param Container $container
129
     *
130
     * @return callable
131
     */
132
    private function getDbsDefinition(Container $container): callable
133
    {
134 3
        return function () use ($container) {
135 3
            $container['doctrine.dbal.dbs.options.initializer']();
136
137 3
            $dbs = new Container();
138 3
            foreach ($container['doctrine.dbal.dbs.options'] as $name => $options) {
139 3
                if ($container['doctrine.dbal.dbs.default'] === $name) {
140 3
                    $config = $container['doctrine.dbal.db.config'];
141 3
                    $manager = $container['doctrine.dbal.db.event_manager'];
142
                } else {
143 1
                    $config = $container['doctrine.dbal.dbs.config'][$name];
144 1
                    $manager = $container['doctrine.dbal.dbs.event_manager'][$name];
145
                }
146
147 3
                $dbs[$name] = function () use ($options, $config, $manager) {
148 3
                    return DriverManager::getConnection($options['connection'], $config, $manager);
149 3
                };
150
            }
151
152 3
            return $dbs;
153 3
        };
154
    }
155
156
    /**
157
     * @param Container $container
158
     *
159
     * @return callable
160
     */
161
    private function getDbsConfigDefinition(Container $container): callable
162
    {
163 3
        return function () use ($container) {
164 3
            $container['doctrine.dbal.dbs.options.initializer']();
165
166 3
            $addLogger = $container['logger'] ?? false;
167
168 3
            $configs = new Container();
169 3
            foreach ($container['doctrine.dbal.dbs.options'] as $name => $options) {
170 3
                $configs[$name] = function () use ($addLogger, $container, $name, $options) {
171 3
                    $configOptions = $options['configuration'];
172
173 3
                    $config = new Configuration();
174
175 3
                    if ($addLogger) {
176 2
                        $config->setSQLLogger(new DoctrineDbalLogger($container['logger']));
177
                    }
178
179 3
                    $cacheFactoryKey = sprintf('doctrine.dbal.db.cache_factory.%s', $configOptions['cache.result']);
180 3
                    $config->setResultCacheImpl($container[$cacheFactoryKey]);
181
182 3
                    $config->setFilterSchemaAssetsExpression($configOptions['filter_schema_assets_expression']);
183 3
                    $config->setAutoCommit($configOptions['auto_commit']);
184
185 3
                    return $config;
186 3
                };
187
            }
188
189 3
            return $configs;
190 3
        };
191
    }
192
193
    /**
194
     * @param Container $container
195
     *
196
     * @return callable
197
     */
198 View Code Duplication
    private function getDbsEventManagerDefinition(Container $container): callable
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
199
    {
200 3
        return function () use ($container) {
201 3
            $container['doctrine.dbal.dbs.options.initializer']();
202
203 3
            $managers = new Container();
204 3
            foreach ($container['doctrine.dbal.dbs.options'] as $name => $options) {
205 3
                $managers[$name] = function () {
206 3
                    return new EventManager();
207 3
                };
208
            }
209
210 3
            return $managers;
211 3
        };
212
    }
213
214
    /**
215
     * @param Container $container
216
     *
217
     * @return callable
218
     */
219
    private function getDbsOptionsInitializerDefinition(Container $container): callable
220
    {
221 3
        return $container->protect(function () use ($container) {
222 3
            static $initialized = false;
223
224 3
            if ($initialized) {
225 3
                return;
226
            }
227
228 3
            $initialized = true;
229
230 3
            foreach ((array) $container['doctrine.dbal.types'] as $typeName => $typeClass) {
231 1
                if (Type::hasType($typeName)) {
232 1
                    Type::overrideType($typeName, $typeClass);
233
                } else {
234 1
                    Type::addType($typeName, $typeClass);
235
                }
236
            }
237
238 3
            if (!isset($container['doctrine.dbal.dbs.options'])) {
239 2
                $container['doctrine.dbal.dbs.options'] = [
240 2
                    'default' => $container['doctrine.dbal.db.options'] ?? [],
241
                ];
242
            }
243
244 3
            $tmp = $container['doctrine.dbal.dbs.options'];
245 3
            foreach ($tmp as $name => &$options) {
246 3
                $options = array_replace_recursive($container['doctrine.dbal.db.default_options'], $options);
247
248 3
                if (!isset($container['doctrine.dbal.dbs.default'])) {
249 3
                    $container['doctrine.dbal.dbs.default'] = $name;
250
                }
251
            }
252
253 3
            $container['doctrine.dbal.dbs.options'] = $tmp;
254 3
        });
255
    }
256
}
257