Test Failed
Push — master ( b5ac9d...1680f3 )
by Dominik
03:46 queued 11s
created

getOrmEmsConfigDefinition()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 64
Code Lines 37

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 35
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 37
c 0
b 0
f 0
dl 0
loc 64
rs 9.328
ccs 35
cts 35
cp 1
cc 2
nc 1
nop 1
crap 2

How to fix   Long Method   

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
declare(strict_types=1);
4
5
namespace Chubbyphp\DoctrineDbServiceProvider\ServiceProvider;
6
7
use Chubbyphp\DoctrineDbServiceProvider\Driver\ClassMapDriver;
8
use Chubbyphp\DoctrineDbServiceProvider\Registry\DoctrineOrmManagerRegistry;
9
use Doctrine\Common\Cache\Cache;
10
use Doctrine\Common\EventManager;
11
use Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain;
12
use Doctrine\Common\Persistence\Mapping\Driver\PHPDriver;
13
use Doctrine\Common\Persistence\Mapping\Driver\StaticPHPDriver;
14
use Doctrine\DBAL\Connection;
15
use Doctrine\ORM\Cache\CacheConfiguration;
16
use Doctrine\ORM\Cache\DefaultCacheFactory;
17
use Doctrine\ORM\Cache\RegionsConfiguration;
18
use Doctrine\ORM\Configuration;
19
use Doctrine\ORM\EntityManager;
20
use Doctrine\ORM\EntityRepository;
21
use Doctrine\ORM\Mapping\ClassMetadataFactory;
22
use Doctrine\ORM\Mapping\DefaultEntityListenerResolver;
23
use Doctrine\ORM\Mapping\DefaultNamingStrategy;
24
use Doctrine\ORM\Mapping\DefaultQuoteStrategy;
25
use Doctrine\ORM\Mapping\Driver\SimplifiedXmlDriver;
26
use Doctrine\ORM\Mapping\Driver\SimplifiedYamlDriver;
27
use Doctrine\ORM\Mapping\Driver\XmlDriver;
28
use Doctrine\ORM\Mapping\Driver\YamlDriver;
29
use Doctrine\ORM\Repository\DefaultRepositoryFactory;
30
use Pimple\Container;
31
use Pimple\ServiceProviderInterface;
32
33
/**
34
 * This provider is heavily inspired by
35
 * https://github.com/dflydev/dflydev-doctrine-orm-service-provider/blob/master/src/Dflydev/Provider/DoctrineOrm/DoctrineOrmServiceProvider.php.
36
 */
37
final class DoctrineOrmServiceProvider implements ServiceProviderInterface
38
{
39 3
    public function register(Container $container): void
40
    {
41 3
        $container['doctrine.orm.em'] = $this->getOrmEmDefinition($container);
42 3
        $container['doctrine.orm.em.config'] = $this->getOrmEmConfigDefinition($container);
43 3
        $container['doctrine.orm.em.default_options'] = $this->getOrmEmDefaultOptions();
44 3
        $container['doctrine.orm.em.factory'] = $this->getOrmEmFactory($container);
45 3
        $container['doctrine.orm.ems'] = $this->getOrmEmsDefinition($container);
46 3
        $container['doctrine.orm.ems.config'] = $this->getOrmEmsConfigDefinition($container);
47 3
        $container['doctrine.orm.ems.name'] = $this->getOrmEmsNameDefinition($container);
48 3
        $container['doctrine.orm.ems.options.initializer'] = $this->getOrmEmsOptionsInitializerDefinition($container);
49 3
        $container['doctrine.orm.entity.listener_resolver.default'] = $this->getOrmEntityListenerResolverDefinition();
50 3
        $container['doctrine.orm.manager_registry'] = $this->getOrmManagerRegistryDefintion($container);
51 3
        $container['doctrine.orm.mapping_driver.factory.annotation'] =
52 3
            $this->getOrmMappingDriverFactoryAnnotation($container);
53 3
        $container['doctrine.orm.mapping_driver.factory.class_map'] =
54 3
            $this->getOrmMappingDriverFactoryClassMap($container);
55 3
        $container['doctrine.orm.mapping_driver.factory.php'] = $this->getOrmMappingDriverFactoryPhp($container);
56 3
        $container['doctrine.orm.mapping_driver.factory.simple_xml'] =
57 3
            $this->getOrmMappingDriverFactorySimpleXml($container);
58 3
        $container['doctrine.orm.mapping_driver.factory.simple_yaml'] =
59 3
            $this->getOrmMappingDriverFactorySimpleYaml($container);
60 3
        $container['doctrine.orm.mapping_driver.factory.static_php'] =
61 3
            $this->getOrmMappingDriverFactoryStaticPhp($container);
62 3
        $container['doctrine.orm.mapping_driver.factory.xml'] = $this->getOrmMappingDriverFactoryXml($container);
63 3
        $container['doctrine.orm.mapping_driver.factory.yaml'] = $this->getOrmMappingDriverFactoryYaml($container);
64 3
        $container['doctrine.orm.mapping_driver_chain'] = $this->getOrmMappingDriverChainDefinition($container);
65 3
        $container['doctrine.orm.repository.factory.default'] = $this->getOrmRepositoryFactoryDefinition();
66 3
        $container['doctrine.orm.strategy.naming.default'] = $this->getOrmNamingStrategyDefinition();
67 3
        $container['doctrine.orm.strategy.quote.default'] = $this->getOrmQuoteStrategyDefinition();
68
    }
69 3
70
    private function getOrmEmDefinition(Container $container): callable
71
    {
72 2
        return static function () use ($container) {
73
            $ems = $container['doctrine.orm.ems'];
74 2
75 3
            return $ems[$container['doctrine.orm.ems.default']];
76
        };
77
    }
78 3
79
    private function getOrmEmConfigDefinition(Container $container): callable
80
    {
81 3
        return static function () use ($container) {
82
            $configs = $container['doctrine.orm.ems.config'];
83 3
84 3
            return $configs[$container['doctrine.orm.ems.default']];
85
        };
86
    }
87
88
    /**
89
     * @return array<string, array|string|float|int|bool>
90 3
     */
91
    private function getOrmEmDefaultOptions(): array
92
    {
93 3
        return [
94
            'cache.hydration' => ['type' => 'array'],
95
            'cache.metadata' => ['type' => 'array'],
96
            'cache.query' => ['type' => 'array'],
97 3
            'class_metadata.factory.name' => ClassMetadataFactory::class,
98
            'connection' => 'default',
99
            'custom.functions.datetime' => [],
100
            'custom.functions.numeric' => [],
101
            'custom.functions.string' => [],
102 3
            'custom.hydration_modes' => [],
103
            'entity.listener_resolver' => 'default',
104
            'mappings' => [],
105 3
            'proxies.auto_generate' => true,
106 3
            'proxies.dir' => sys_get_temp_dir().'/doctrine/orm/proxies',
107
            'proxies.namespace' => 'DoctrineProxy',
108
            'query_hints' => [],
109 3
            'repository.default.class' => EntityRepository::class,
110
            'repository.factory' => 'default',
111
            'second_level_cache' => ['type' => 'array'],
112 3
            'second_level_cache.enabled' => false,
113 3
            'strategy.naming' => 'default',
114
            'strategy.quote' => 'default',
115
        ];
116
    }
117 3
118
    private function getOrmEmFactory(Container $container): callable
119 3
    {
120
        return $container->protect(
121 3
            static function (Connection $connection, Configuration $config, EventManager $eventManager) {
122 3
                return EntityManager::create($connection, $config, $eventManager);
123
            }
124
        );
125
    }
126 3
127
    private function getOrmEmsDefinition(Container $container): callable
128
    {
129 3
        return static function () use ($container) {
130
            $container['doctrine.orm.ems.options.initializer']();
131 3
132 3
            $ems = new Container();
133 3
            foreach ($container['doctrine.orm.ems.options'] as $name => $options) {
134 3
                if ($container['doctrine.orm.ems.default'] === $name) {
135
                    $config = $container['doctrine.orm.em.config'];
136 1
                } else {
137
                    $config = $container['doctrine.orm.ems.config'][$name];
138
                }
139
140 3
                $ems[$name] = static function () use ($container, $options, $config) {
141 3
                    return $container['doctrine.orm.em.factory'](
142 3
                        $container['doctrine.dbal.dbs'][$options['connection']],
143 3
                        $config,
144
                        $container['doctrine.dbal.dbs.event_manager'][$options['connection']]
145 3
                    );
146
                };
147
            }
148 3
149 3
            return $ems;
150
        };
151
    }
152 3
153
    private function getOrmEmsConfigDefinition(Container $container): callable
154
    {
155 3
        return function () use ($container) {
156
            $container['doctrine.orm.ems.options.initializer']();
157 3
158 3
            $configs = new Container();
159 3
            foreach ($container['doctrine.orm.ems.options'] as $name => $options) {
160
                $configs[$name] = function () use ($container, $options) {
161 3
                    $connectionName = $options['connection'];
162
163 3
                    $config = new Configuration();
164
165 3
                    $config->setSQLLogger($container['doctrine.dbal.dbs.config'][$connectionName]->getSQLLogger());
166 3
167 3
                    $config->setQueryCacheImpl($this->getCache($container, $options['cache.query']));
168
                    $config->setHydrationCacheImpl($this->getCache($container, $options['cache.hydration']));
169 3
                    $config->setMetadataCacheImpl($this->getCache($container, $options['cache.metadata']));
170 3
171
                    $config->setResultCacheImpl(
172
                        $container['doctrine.dbal.dbs.config'][$connectionName]->getResultCacheImpl()
173 3
                    );
174
175 3
                    $config->setClassMetadataFactoryName($options['class_metadata.factory.name']);
176 3
177 3
                    $config->setCustomDatetimeFunctions($options['custom.functions.datetime']);
178 3
                    $config->setCustomHydrationModes($options['custom.hydration_modes']);
179
                    $config->setCustomNumericFunctions($options['custom.functions.numeric']);
180 3
                    $config->setCustomStringFunctions($options['custom.functions.string']);
181
182 3
                    $config->setEntityListenerResolver(
183
                        $container[
184
                            sprintf('doctrine.orm.entity.listener_resolver.%s', $options['entity.listener_resolver'])
185
                        ]
186 3
                    );
187 3
188
                    $config->setMetadataDriverImpl(
189
                        $container['doctrine.orm.mapping_driver_chain']($config, $options['mappings'])
190 3
                    );
191 3
192 3
                    $config->setAutoGenerateProxyClasses($options['proxies.auto_generate']);
193
                    $config->setProxyDir($options['proxies.dir']);
194 3
                    $config->setProxyNamespace($options['proxies.namespace']);
195
196 3
                    $config->setDefaultQueryHints($options['query_hints']);
197 3
198
                    $config->setRepositoryFactory(
199 3
                        $container[sprintf('doctrine.orm.repository.factory.%s', $options['repository.factory'])]
200
                    );
201 3
                    $config->setDefaultRepositoryClassName($options['repository.default.class']);
202
203 3
                    $this->assignSecondLevelCache($container, $config, $options);
204 3
205
                    $config->setNamingStrategy(
206 3
                        $container[sprintf('doctrine.orm.strategy.naming.%s', $options['strategy.naming'])]
207 3
                    );
208
                    $config->setQuoteStrategy(
209
                        $container[sprintf('doctrine.orm.strategy.quote.%s', $options['strategy.quote'])]
210 3
                    );
211
212
                    return $config;
213 3
                };
214 3
            }
215
216
            return $configs;
217 3
        };
218
    }
219 3
220 3
    private function getCache(Container $container, array $cacheDefinition): Cache
221
    {
222 3
        $cacheType = $cacheDefinition['type'];
223
        $cacheOptions = $cacheDefinition['options'] ?? [];
224 3
225
        $cacheFactory = $container[sprintf('doctrine.dbal.db.cache_factory.%s', $cacheType)];
226
227 3
        return $cacheFactory($cacheOptions);
228
    }
229 3
230 2
    private function assignSecondLevelCache(Container $container, Configuration $config, array $options): void
231
    {
232 2
        if (!$options['second_level_cache.enabled']) {
233
            $config->setSecondLevelCacheEnabled(false);
234
235 1
            return;
236 1
        }
237 1
238 1
        $regionsCacheConfiguration = new RegionsConfiguration();
239
        $factory = new DefaultCacheFactory(
240
            $regionsCacheConfiguration,
241 1
            $this->getCache($container, $options['second_level_cache'])
242 1
        );
243 1
244
        $cacheConfiguration = new CacheConfiguration();
245 1
        $cacheConfiguration->setCacheFactory($factory);
246 1
        $cacheConfiguration->setRegionsConfiguration($regionsCacheConfiguration);
247 1
248
        $config->setSecondLevelCacheEnabled(true);
249 3
        $config->setSecondLevelCacheConfiguration($cacheConfiguration);
250
    }
251
252 3
    private function getOrmEmsNameDefinition(Container $container): callable
253
    {
254 3
        return static function () use ($container) {
255 3
            $container['doctrine.orm.ems.options.initializer']();
256
257
            return array_keys($container['doctrine.orm.ems.options']);
258 3
        };
259
    }
260 3
261 2
    private function getOrmEmsOptionsInitializerDefinition(Container $container): callable
262 2
    {
263
        return $container->protect(static function () use ($container): void {
264
            static $initialized = false;
265
266 3
            if ($initialized) {
267 3
                return;
268 3
            }
269
270 3
            $initialized = true;
271 3
272
            if (!isset($container['doctrine.orm.ems.options'])) {
273
                $container['doctrine.orm.ems.options'] = [
274
                    'default' => $container['doctrine.orm.em.options'] ?? [],
275 3
                ];
276 3
            }
277
278
            $tmp = $container['doctrine.orm.ems.options'];
279 3
            foreach ($tmp as $name => &$options) {
280
                $options = array_replace($container['doctrine.orm.em.default_options'], $options);
281
282 2
                if (!isset($container['doctrine.orm.ems.default'])) {
283 3
                    $container['doctrine.orm.ems.default'] = $name;
284
                }
285
            }
286 3
287
            $container['doctrine.orm.ems.options'] = $tmp;
288
        });
289 1
    }
290 3
291
    private function getOrmEntityListenerResolverDefinition(): callable
292
    {
293 3
        return static function () {
294
            return new DefaultEntityListenerResolver();
295
        };
296 2
    }
297 3
298
    private function getOrmManagerRegistryDefintion(Container $container): callable
299
    {
300 3
        return static function () use ($container) {
301
            return new DoctrineOrmManagerRegistry($container);
302
        };
303 1
    }
304 3
305
    private function getOrmMappingDriverFactoryAnnotation(Container $container): callable
306
    {
307 3
        return $container->protect(static function (array $mapping, Configuration $config) {
308
            return $config->newDefaultAnnotationDriver($mapping['path'], false);
309
        });
310 1
    }
311 3
312
    private function getOrmMappingDriverFactoryClassMap(Container $container): callable
313
    {
314 3
        return $container->protect(static function (array $mapping) {
315
            return new ClassMapDriver($mapping['map']);
316
        });
317 1
    }
318 1
319 1
    private function getOrmMappingDriverFactoryPhp(Container $container): callable
320
    {
321 3
        return $container->protect(static function (array $mapping) {
322
            return new PHPDriver($mapping['path']);
323
        });
324 3
    }
325
326
    private function getOrmMappingDriverFactorySimpleYaml(Container $container): callable
327 1
    {
328 1
        return $container->protect(static function (array $mapping) {
329 1
            return new SimplifiedYamlDriver(
330
                [$mapping['path'] => $mapping['namespace']],
331 3
                $mapping['extension'] ?? SimplifiedYamlDriver::DEFAULT_FILE_EXTENSION
332
            );
333
        });
334 3
    }
335
336
    private function getOrmMappingDriverFactorySimpleXml(Container $container): callable
337 1
    {
338 3
        return $container->protect(static function (array $mapping) {
339
            return new SimplifiedXmlDriver(
340
                [$mapping['path'] => $mapping['namespace']],
341 3
                $mapping['extension'] ?? SimplifiedXmlDriver::DEFAULT_FILE_EXTENSION
342
            );
343
        });
344 1
    }
345 3
346
    private function getOrmMappingDriverFactoryStaticPhp(Container $container): callable
347
    {
348 3
        return $container->protect(static function (array $mapping) {
349
            return new StaticPHPDriver($mapping['path']);
350
        });
351 1
    }
352 3
353
    private function getOrmMappingDriverFactoryYaml(Container $container): callable
354
    {
355 3
        return $container->protect(static function (array $mapping) {
356
            return new YamlDriver($mapping['path'], $mapping['extension'] ?? YamlDriver::DEFAULT_FILE_EXTENSION);
0 ignored issues
show
Deprecated Code introduced by
The class Doctrine\ORM\Mapping\Driver\YamlDriver has been deprecated: 2.7 This class is being removed from the ORM and won't have any replacement ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

356
            return /** @scrutinizer ignore-deprecated */ new YamlDriver($mapping['path'], $mapping['extension'] ?? YamlDriver::DEFAULT_FILE_EXTENSION);
Loading history...
357
        });
358 3
    }
359 3
360 2
    private function getOrmMappingDriverFactoryXml(Container $container): callable
361 1
    {
362
        return $container->protect(static function (array $mapping) {
363
            return new XmlDriver($mapping['path'], $mapping['extension'] ?? XmlDriver::DEFAULT_FILE_EXTENSION);
364 2
        });
365
    }
366 2
367
    private function getOrmMappingDriverChainDefinition(Container $container): callable
368
    {
369 3
        return $container->protect(static function (Configuration $config, array $mappings) use ($container) {
370 3
            $chain = new MappingDriverChain();
371
            foreach ($mappings as $mapping) {
372
                if (isset($mapping['alias'])) {
373 3
                    $config->addEntityNamespace($mapping['alias'], $mapping['namespace']);
374
                }
375
376 2
                $factoryKey = sprintf('doctrine.orm.mapping_driver.factory.%s', $mapping['type']);
377 3
378
                $chain->addDriver($container[$factoryKey]($mapping, $config), $mapping['namespace']);
379
            }
380 3
381
            return $chain;
382
        });
383 2
    }
384 3
385
    private function getOrmRepositoryFactoryDefinition(): callable
386
    {
387 3
        return static function () {
388
            return new DefaultRepositoryFactory();
389
        };
390 2
    }
391 3
392
    private function getOrmNamingStrategyDefinition(): callable
393
    {
394
        return static function () {
395
            return new DefaultNamingStrategy();
396
        };
397
    }
398
399
    private function getOrmQuoteStrategyDefinition(): callable
400
    {
401
        return static function () {
402
            return new DefaultQuoteStrategy();
403
        };
404
    }
405
}
406