MigrationExtensionPass   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 69
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 4

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 13
c 1
b 0
f 0
lcom 0
cbo 4
dl 0
loc 69
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A process() 0 15 3
D loadExtensions() 0 37 10
1
<?php
2
3
namespace RDV\Bundle\MigrationBundle\DependencyInjection\Compiler;
4
5
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
6
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
7
use Symfony\Component\DependencyInjection\ContainerBuilder;
8
use Symfony\Component\DependencyInjection\Reference;
9
10
class MigrationExtensionPass implements CompilerPassInterface
11
{
12
    const MANAGER_SERVICE_KEY = 'rdv_migration.migrations.extension_manager';
13
    const TAG                 = 'rdv_migration.extension';
14
15
    /**
16
     * {@inheritdoc}
17
     */
18
    public function process(ContainerBuilder $container)
19
    {
20
        if (!$container->hasDefinition(self::MANAGER_SERVICE_KEY)) {
21
            return;
22
        }
23
        $storageDefinition = $container->getDefinition(self::MANAGER_SERVICE_KEY);
24
25
        $extensions = $this->loadExtensions($container);
26
        foreach ($extensions as $extensionName => $extensionServiceId) {
27
            $storageDefinition->addMethodCall(
28
                'addExtension',
29
                [$extensionName, new Reference($extensionServiceId)]
30
            );
31
        }
32
    }
33
34
    /**
35
     * Load migration extensions services
36
     *
37
     * @param ContainerBuilder $container
38
     * @return array
39
     * @throws InvalidConfigurationException
40
     */
41
    protected function loadExtensions(ContainerBuilder $container)
42
    {
43
        $taggedServices = $container->findTaggedServiceIds(self::TAG);
44
        $extensions     = [];
45
        foreach ($taggedServices as $id => $tagAttributes) {
46
            if ($container->hasDefinition($id)) {
47
                $container->getDefinition($id)->setPublic(false);
48
            }
49
            $priority = 0;
50
            $extensionName = null;
51
            foreach ($tagAttributes as $attributes) {
52
                if (!empty($attributes['priority'])) {
53
                    $priority = (int)$attributes['priority'];
54
                }
55
                if (!isset($attributes['extension_name']) || empty($attributes['extension_name'])) {
56
                    throw new InvalidConfigurationException(
57
                        sprintf('Tag attribute "extension_name" is required for "%s" service', $id)
58
                    );
59
                }
60
                $extensionName = $attributes['extension_name'];
61
            }
62
            if (!isset($extensions[$extensionName])) {
63
                $extensions[$extensionName] = [];
64
            }
65
            $extensions[$extensionName][$priority] = $id;
66
        }
67
68
        $result = [];
69
        foreach ($extensions as $name => $extension) {
70
            if (count($extension) > 1) {
71
                krsort($extension);
72
            }
73
            $result[$name] = array_pop($extension);
74
        }
75
76
        return $result;
77
    }
78
}
79