Failed Conditions
Pull Request — master (#318)
by Asmir
03:00
created

DoctrineMigrationsExtension   A

Complexity

Total Complexity 20

Size/Duplication

Total Lines 112
Duplicated Lines 0 %

Test Coverage

Coverage 92.98%

Importance

Changes 1
Bugs 0 Features 1
Metric Value
wmc 20
eloc 52
c 1
b 0
f 1
dl 0
loc 112
ccs 53
cts 57
cp 0.9298
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A getNamespace() 0 3 1
A getXsdValidationBasePath() 0 3 1
F load() 0 73 14
A checkIfBundleRelativePath() 0 16 4
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Doctrine\Bundle\MigrationsBundle\DependencyInjection;
6
7
use Doctrine\Migrations\Metadata\Storage\MetadataStorage;
8
use Doctrine\Migrations\Metadata\Storage\TableMetadataStorageConfiguration;
9
use InvalidArgumentException;
10
use ReflectionClass;
11
use RuntimeException;
12
use Symfony\Component\Config\FileLocator;
13
use Symfony\Component\DependencyInjection\ContainerBuilder;
14
use Symfony\Component\DependencyInjection\Definition;
15
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
16
use Symfony\Component\DependencyInjection\Reference;
17
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
18
use function array_keys;
19
use function dirname;
20
use function explode;
21
use function implode;
22
use function sprintf;
23
use function strlen;
24
use function substr;
25
26
/**
27
 * DoctrineMigrationsExtension.
28
 */
29
class DoctrineMigrationsExtension extends Extension
30
{
31
    /**
32
     * Responds to the migrations configuration parameter.
33
     *
34
     * @param string[][] $configs
35
     */
36 23
    public function load(array $configs, ContainerBuilder $container) : void
37
    {
38 23
        $configuration = new Configuration();
39
40 23
        $config = $this->processConfiguration($configuration, $configs);
41
42 21
        $locator = new FileLocator(__DIR__ . '/../Resources/config/');
43 21
        $loader  = new XmlFileLoader($container, $locator);
44
45 21
        $loader->load('services.xml');
46
47 21
        $configurationDefinition = $container->getDefinition('doctrine.migrations.configuration');
48
49 21
        foreach ($config['migrations_paths'] as $ns => $path) {
50 21
            $path = $this->checkIfBundleRelativePath($path, $container);
51 21
            $configurationDefinition->addMethodCall('addMigrationsDirectory', [$ns, $path]);
52
        }
53
54 21
        foreach ($config['migrations'] as $migrationClass) {
55 2
            $configurationDefinition->addMethodCall('addMigrationClass', [$migrationClass]);
56
        }
57
58 21
        if ($config['organize_migrations'] !== false) {
59 2
            $configurationDefinition->addMethodCall('setMigrationOrganization', [$config['organize_migrations']]);
60
        }
61
62 21
        if ($config['custom_template'] !== null) {
63
            $configurationDefinition->addMethodCall('setCustomTemplate', [$config['custom_template']]);
64
        }
65
66 21
        $configurationDefinition->addMethodCall('setAllOrNothing', [$config['all_or_nothing']]);
67 21
        $configurationDefinition->addMethodCall('setCheckDatabasePlatform', [$config['check_database_platform']]);
68
69 21
        $diDefinition = $container->getDefinition('doctrine.migrations.dependency_factory');
70
71 21
        foreach ($config['services'] as $doctrineId => $symfonyId) {
72 2
            $diDefinition->addMethodCall('setService', [$doctrineId, new Reference($symfonyId)]);
73
        }
74
75 21
        if (! isset($config['services'][MetadataStorage::class])) {
76 20
            $storageConfiguration = $config['storage']['table_storage'];
77
78 20
            $storageDefinition = new Definition(TableMetadataStorageConfiguration::class);
79 20
            $container->setDefinition('doctrine.migrations.storage.table_storage', $storageDefinition);
80 20
            $container->setAlias('doctrine.migrations.metadata_storage', 'doctrine.migrations.storage.table_storage');
81
82 20
            if ($storageConfiguration['table_name']!== null) {
83 2
                $storageDefinition->addMethodCall('setTableName', [$storageConfiguration['table_name']]);
84
            }
85 20
            if ($storageConfiguration['version_column_name']!== null) {
86 2
                $storageDefinition->addMethodCall('setVersionColumnName', [$storageConfiguration['version_column_name']]);
87
            }
88 20
            if ($storageConfiguration['version_column_length']!== null) {
89 2
                $storageDefinition->addMethodCall('setVersionColumnLength', [$storageConfiguration['version_column_length']]);
90
            }
91 20
            if ($storageConfiguration['executed_at_column_name']!== null) {
92 2
                $storageDefinition->addMethodCall('setExecutedAtColumnName', [$storageConfiguration['executed_at_column_name']]);
93
            }
94 20
            if ($storageConfiguration['execution_time_column_name']!== null) {
95 2
                $storageDefinition->addMethodCall('setExecutionTimeColumnName', [$storageConfiguration['execution_time_column_name']]);
96
            }
97
98 20
            $configurationDefinition->addMethodCall('setMetadataStorageConfiguration', [new Reference('doctrine.migrations.storage.table_storage')]);
99
        }
100
101 21
        if ($config['em'] !== null && $config['connection'] !== null) {
102 1
            throw new InvalidArgumentException(
103 1
                'You cannot specify both "connection" and "em" in the DoctrineMigrationsBundle configurations.'
104
            );
105
        }
106
107 20
        $container->setParameter('doctrine.migrations.preferred_em', $config['em']);
108 20
        $container->setParameter('doctrine.migrations.preferred_connection', $config['connection']);
109 20
    }
110
111 21
    private function checkIfBundleRelativePath(string $path, ContainerBuilder $container) : string
112
    {
113 21
        if (isset($path[0]) && $path[0] === '@') {
114 1
            $pathParts  = explode('/', $path);
115 1
            $bundleName = substr($pathParts[0], 1);
116
117 1
            $bundles = $container->getParameter('kernel.bundles');
118 1
            if (! isset($bundles[$bundleName])) {
119
                throw new RuntimeException(sprintf('The bundle "%s" has not been registered with AppKernel. Available bundles: %s', $bundleName, implode(', ', array_keys($bundles))));
120
            }
121
122 1
            $ref = new ReflectionClass($bundles[$bundleName]);
123 1
            return dirname($ref->getFileName()) . substr($path, strlen('@' . $bundleName));
124
        }
125
126 20
        return $path;
127
    }
128
    /**
129
     * Returns the base path for the XSD files.
130
     *
131
     * @return string The XSD base path
132
     */
133
    public function getXsdValidationBasePath() : string
134
    {
135
        return __DIR__ . '/../Resources/config/schema';
136
    }
137
138 1
    public function getNamespace() : string
139
    {
140 1
        return 'http://symfony.com/schema/dic/doctrine/migrations/3.0';
141
    }
142
}
143