Passed
Push — master ( 6c7aff...ce6d49 )
by
unknown
46:49 queued 20:16
created

ConfigurationModuleProviderPass   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 41
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 10
eloc 23
dl 0
loc 41
rs 10
c 1
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
B process() 0 32 9
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the TYPO3 CMS project.
7
 *
8
 * It is free software; you can redistribute it and/or modify it under
9
 * the terms of the GNU General Public License, either version 2
10
 * of the License, or any later version.
11
 *
12
 * For the full copyright and license information, please read the
13
 * LICENSE.txt file that was distributed with this source code.
14
 *
15
 * The TYPO3 project - inspiring people to share!
16
 */
17
18
namespace TYPO3\CMS\Lowlevel\DependencyInjection;
19
20
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
21
use Symfony\Component\DependencyInjection\ContainerBuilder;
22
use TYPO3\CMS\Core\Service\DependencyOrderingService;
23
use TYPO3\CMS\Core\Utility\GeneralUtility;
24
use TYPO3\CMS\Lowlevel\ConfigurationModuleProvider\ProviderRegistry;
25
26
/**
27
 * Receives all services which are tagged as configuration provider, validates
28
 * their attributes, orders the using the DependencyOrderingService and finally
29
 * forwards them to the ConfigurationProviderRegistry.
30
 */
31
final class ConfigurationModuleProviderPass implements CompilerPassInterface
32
{
33
    protected string $tagName;
34
35
    public function __construct(string $tagName)
36
    {
37
        $this->tagName = $tagName;
38
    }
39
40
    public function process(ContainerBuilder $container): void
41
    {
42
        $configurationModuleProviderRegistryDefinition = $container->findDefinition(ProviderRegistry::class);
43
        $providerList = [];
44
45
        foreach ($container->findTaggedServiceIds($this->tagName) as $id => $tags) {
46
            $definition = $container->findDefinition($id);
47
            if (!$definition->isAutoconfigured() || $definition->isAbstract()) {
48
                continue;
49
            }
50
51
            foreach ($tags as $attributes) {
52
                if (!isset($attributes['identifier']) || (bool)($attributes['disabled'] ?? false)) {
53
                    continue;
54
                }
55
                $providerList[$attributes['identifier']] = [
56
                    'definition' => $definition,
57
                    'attributes' => $attributes,
58
                    'before' => GeneralUtility::trimExplode(',', $attributes['before'] ?? '', true),
59
                    'after'  => GeneralUtility::trimExplode(',', $attributes['after'] ?? '', true),
60
                ];
61
            }
62
        }
63
64
        if ($container->has(DependencyOrderingService::class)) {
65
            $providerList = $container->get(DependencyOrderingService::class)->orderByDependencies($providerList);
66
        }
67
68
        foreach ($providerList as $provider) {
69
            $configurationModuleProviderRegistryDefinition->addMethodCall(
70
                'registerProvider',
71
                [$provider['definition'], $provider['attributes']]
72
            );
73
        }
74
    }
75
}
76