Passed
Pull Request — master (#331)
by
unknown
08:29
created

configureDHMiddleware()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 25
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 17
nc 5
nop 2
dl 0
loc 25
rs 9.3888
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace DH\AuditorBundle\DependencyInjection\Compiler;
6
7
use DH\Auditor\Provider\Doctrine\Auditing\Annotation\AnnotationLoader;
8
use DH\Auditor\Provider\Doctrine\Auditing\Logger\Middleware\DHMiddleware;
0 ignored issues
show
Bug introduced by
The type DH\Auditor\Provider\Doct...Middleware\DHMiddleware was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
9
use DH\Auditor\Provider\Doctrine\DoctrineProvider;
10
use DH\Auditor\Provider\Doctrine\Service\AuditingService;
11
use DH\Auditor\Provider\Doctrine\Service\StorageService;
12
use Doctrine\DBAL\Driver\Middleware;
13
use Symfony\Component\DependencyInjection\ChildDefinition;
14
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
15
use Symfony\Component\DependencyInjection\ContainerBuilder;
16
use Symfony\Component\DependencyInjection\Definition;
17
use Symfony\Component\DependencyInjection\Reference;
18
19
/** @see \DH\AuditorBundle\Tests\DependencyInjection\Compiler\DoctrineMiddlewareCompilerPassTest */
20
class DoctrineProviderConfigurationCompilerPass implements CompilerPassInterface
21
{
22
    private bool $isDHMiddlewareSupported = false;
23
24
    public function process(ContainerBuilder $container): void
25
    {
26
        if (!$container->hasDefinition(DoctrineProvider::class)) {
27
            return;
28
        }
29
30
        $doctrineProviderConfigurationKey = 'dh_auditor.provider.doctrine.configuration';
31
        if (!$container->hasParameter($doctrineProviderConfigurationKey)) {
32
            return;
33
        }
34
35
        $providerDefinition = $container->getDefinition(DoctrineProvider::class);
36
        $config = $container->getParameter($doctrineProviderConfigurationKey);
37
38
        \assert(\is_array($config) && \array_key_exists('storage_services', $config));
39
        foreach (array_unique($config['storage_services']) as $entityManagerName) {
40
            $entityManagerName = str_replace('@', '', $entityManagerName);
41
            $entityManagerReference = new Reference($entityManagerName);
42
43
            $service = 'dh_auditor.provider.doctrine.storage_services.'.$entityManagerName;
44
            $serviceDefinition = new Definition(StorageService::class, [
45
                $service,
46
                $entityManagerReference,
47
            ]);
48
            $container->setDefinition($service, $serviceDefinition);
49
            $serviceReference = new Reference($service);
50
51
            $providerDefinition->addMethodCall('registerStorageService', [$serviceReference]);
52
        }
53
54
        \assert(\is_array($config) && \array_key_exists('auditing_services', $config));
55
56
        $this->registerDHMiddleware($container);
57
58
        foreach (array_unique($config['auditing_services']) as $entityManagerName) {
59
            $entityManagerName = str_replace('@', '', $entityManagerName);
60
            $entityManagerReference = new Reference($entityManagerName);
61
62
            $service = 'dh_auditor.provider.doctrine.auditing_services.'.$entityManagerName;
63
            $serviceDefinition = new Definition(AuditingService::class, [
64
                $service,
65
                $entityManagerReference,
66
            ]);
67
            $container->setDefinition($service, $serviceDefinition);
68
            $serviceReference = new Reference($service);
69
70
            $annotationLoaderDefinition = new Definition(AnnotationLoader::class, [$entityManagerReference]);
71
            $container->setDefinition(AnnotationLoader::class, $annotationLoaderDefinition);
72
73
            $providerDefinition->addMethodCall('registerAuditingService', [$serviceReference]);
74
            $this->configureDHMiddleware($container, $entityManagerName);
75
        }
76
    }
77
78
    private function registerDHMiddleware(ContainerBuilder $container): void
79
    {
80
        $this->isDHMiddlewareSupported = interface_exists(Middleware::class) && class_exists(DHMiddleware::class);
81
        if ($this->isDHMiddlewareSupported) {
82
            $container->register('doctrine.dbal.dh_middleware', DHMiddleware::class);
83
        }
84
    }
85
86
    private function configureDHMiddleware(ContainerBuilder $container, string $entityManagerName): void
87
    {
88
        if (false === $this->isDHMiddlewareSupported) {
89
            return;
90
        }
91
92
        $argument = $container->getDefinition($entityManagerName)->getArgument(0);
93
        if (!$argument instanceof Reference) {
94
            return;
95
        }
96
        $connectionName = (string) $argument;
97
        if (1 !== preg_match('/^doctrine.dbal.(.+)_connection$/', $connectionName, $matches)) {
98
            return;
99
        }
100
        $name = $matches[1];
101
        $configurationName = sprintf('doctrine.dbal.%s_connection.configuration', $name);
102
        if (!$container->hasDefinition($configurationName)) {
103
            return;
104
        }
105
        $configuration = $container->getDefinition($configurationName);
106
        $loggingMiddlewareDef = $container->setDefinition(
107
            sprintf('doctrine.dbal.%s_connection.dh_middleware', $name),
108
            new ChildDefinition('doctrine.dbal.dh_middleware')
109
        );
110
        $configuration->addMethodCall('setMiddlewares', [[$loggingMiddlewareDef]]);
111
    }
112
}
113