Passed
Push — master ( 363181...2a6c23 )
by Damien
02:23
created

DoctrineProviderConfigurationCompilerPass   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 49
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 32
dl 0
loc 49
rs 10
c 0
b 0
f 0
wmc 5

1 Method

Rating   Name   Duplication   Size   Complexity  
A process() 0 47 5
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\Auditing\Event\DoctrineSubscriber;
7
use DH\Auditor\Provider\Doctrine\Auditing\Transaction\TransactionManager;
8
use DH\Auditor\Provider\Doctrine\DoctrineProvider;
9
use DH\Auditor\Provider\Doctrine\Service\AuditingService;
10
use DH\Auditor\Provider\Doctrine\Service\StorageService;
11
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
12
use Symfony\Component\DependencyInjection\ContainerBuilder;
13
use Symfony\Component\DependencyInjection\Definition;
14
use Symfony\Component\DependencyInjection\Reference;
15
16
class DoctrineProviderConfigurationCompilerPass implements CompilerPassInterface
17
{
18
    public function process(ContainerBuilder $container): void
19
    {
20
        if (!$container->hasDefinition(DoctrineProvider::class)) {
21
            return;
22
        }
23
24
        $doctrineProviderConfigurationKey = 'dh_auditor.provider.doctrine.configuration';
25
        if (!$container->hasParameter($doctrineProviderConfigurationKey)) {
26
            return;
27
        }
28
29
        $providerDefinition = $container->getDefinition(DoctrineProvider::class);
30
        $config = $container->getParameter($doctrineProviderConfigurationKey);
31
        foreach ($config['storage_services'] as $service) {
32
            $service = str_replace('@', '', $service);
33
            $entityManagerReference = new Reference($service);
34
35
            $serviceDefinition = new Definition(StorageService::class, [
36
                'dh_auditor.provider.doctrine.storage_services.'.$service,
37
                $entityManagerReference,
38
            ]);
39
            $container->setDefinition(StorageService::class, $serviceDefinition);
40
            $serviceReference = new Reference(StorageService::class);
41
42
            $providerDefinition->addMethodCall('registerStorageService', [$serviceReference]);
43
        }
44
45
        $transactionManagerReference = new Definition(TransactionManager::class, [$providerDefinition]);
46
        $doctrineSubscriberDefinition = new Definition(DoctrineSubscriber::class, [$transactionManagerReference]);
47
        $doctrineSubscriberDefinition->addTag('doctrine.event_subscriber');
48
        $container->setDefinition(DoctrineSubscriber::class, $doctrineSubscriberDefinition);
49
50
        foreach ($config['auditing_services'] as $service) {
51
            $service = str_replace('@', '', $service);
52
            $entityManagerReference = new Reference($service);
53
54
            $serviceDefinition = new Definition(AuditingService::class, [
55
                'dh_auditor.provider.doctrine.auditing_services.'.$service,
56
                $entityManagerReference,
57
            ]);
58
            $container->setDefinition(AuditingService::class, $serviceDefinition);
59
            $serviceReference = new Reference(AuditingService::class);
60
61
            $annotationLoaderDefinition = new Definition(AnnotationLoader::class, [$entityManagerReference]);
62
            $container->setDefinition(AnnotationLoader::class, $annotationLoaderDefinition);
63
64
            $providerDefinition->addMethodCall('registerAuditingService', [$serviceReference]);
65
        }
66
    }
67
}
68