Passed
Push — 4.0-wip ( 6335ec...2b093e )
by Damien
04:23
created

StorageConfigurationCompilerPass::process()   A

Complexity

Conditions 5
Paths 6

Size

Total Lines 42
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 5
eloc 27
c 1
b 0
f 0
nc 6
nop 1
dl 0
loc 42
rs 9.1768
1
<?php
2
3
namespace DH\AuditorBundle\DependencyInjection\Compiler;
4
5
use DH\Auditor\Provider\Doctrine\Auditing\Annotation\AnnotationLoader;
6
use DH\Auditor\Provider\Doctrine\DoctrineProvider;
7
use DH\Auditor\Provider\Doctrine\Service\AuditingService;
8
use DH\Auditor\Provider\Doctrine\Service\StorageService;
9
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
10
use Symfony\Component\DependencyInjection\ContainerBuilder;
11
use Symfony\Component\DependencyInjection\Definition;
12
use Symfony\Component\DependencyInjection\Reference;
13
14
class StorageConfigurationCompilerPass implements CompilerPassInterface
15
{
16
    public function process(ContainerBuilder $container): void
17
    {
18
        if (!$container->hasDefinition(DoctrineProvider::class)) {
19
            return;
20
        }
21
22
        $doctrineProviderConfigurationKey = 'dh_auditor.provider.doctrine.configuration';
23
        if (!$container->hasParameter($doctrineProviderConfigurationKey)) {
24
            return;
25
        }
26
27
        $providerDefinition = $container->getDefinition(DoctrineProvider::class);
28
        $config = $container->getParameter($doctrineProviderConfigurationKey);
29
        foreach ($config['storage_services'] as $service) {
30
            $service = str_replace('@', '', $service);
31
            $entityManagerReference = new Reference($service);
32
33
            $serviceDefinition = new Definition(StorageService::class, [
34
                'dh_auditor.provider.doctrine.storage_services.'.$service,
35
                $entityManagerReference,
36
            ]);
37
            $container->setDefinition(StorageService::class, $serviceDefinition);
38
            $serviceReference = new Reference(StorageService::class);
39
40
            $providerDefinition->addMethodCall('registerStorageService', [$serviceReference]);
41
        }
42
43
        foreach ($config['auditing_services'] as $service) {
44
            $service = str_replace('@', '', $service);
45
            $entityManagerReference = new Reference($service);
46
47
            $serviceDefinition = new Definition(AuditingService::class, [
48
                'dh_auditor.provider.doctrine.auditing_services.'.$service,
49
                $entityManagerReference,
50
            ]);
51
            $container->setDefinition(AuditingService::class, $serviceDefinition);
52
            $serviceReference = new Reference(AuditingService::class);
53
54
            $annotationLoaderDefinition = new Definition(AnnotationLoader::class, [$entityManagerReference]);
55
            $container->setDefinition(AnnotationLoader::class, $annotationLoaderDefinition);
56
57
            $providerDefinition->addMethodCall('registerAuditingService', [$serviceReference]);
58
        }
59
    }
60
}
61