Failed Conditions
Push — master ( f9b4c0...25e0b2 )
by Asmir
41s queued 11s
created

checkIfBundleRelativePath()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 11
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 3

Importance

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