Passed
Push — master ( 1a0e8b...4e85a8 )
by Asmir
04:29 queued 11s
created

DoctrineCommand   A

Complexity

Total Complexity 25

Size/Duplication

Total Lines 112
Duplicated Lines 0 %

Test Coverage

Coverage 51.72%

Importance

Changes 13
Bugs 1 Features 0
Metric Value
eloc 58
c 13
b 1
f 0
dl 0
loc 112
rs 10
ccs 30
cts 58
cp 0.5172
wmc 25

2 Methods

Rating   Name   Duplication   Size   Complexity  
A injectContainerToMigrations() 0 9 3
F configureMigrations() 0 94 22
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Doctrine\Bundle\MigrationsBundle\Command;
6
7
use Doctrine\Bundle\DoctrineBundle\Command\DoctrineCommand as BaseCommand;
8
use Doctrine\Migrations\Configuration\AbstractFileConfiguration;
9
use Doctrine\Migrations\Configuration\Configuration;
10
use Doctrine\Migrations\Version\Version;
11
use ErrorException;
12
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
13
use Symfony\Component\DependencyInjection\ContainerInterface;
14
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
15
use function error_get_last;
16
use function is_dir;
17
use function method_exists;
18
use function mkdir;
19
use function preg_match;
20
use function sprintf;
21
use function str_replace;
22
23
/**
24
 * Base class for Doctrine console commands to extend from.
25
 */
26
abstract class DoctrineCommand extends BaseCommand
27
{
28 1
    public static function configureMigrations(ContainerInterface $container, Configuration $configuration) : void
29
    {
30 1
        $dir = $configuration->getMigrationsDirectory();
31
32 1
        if (empty($dir)) {
33 1
            $dir = $container->getParameter('doctrine_migrations.dir_name');
34
35 1
            if (! is_dir($dir) && ! @mkdir($dir, 0777, true) && ! is_dir($dir)) {
36
                $error = error_get_last();
37
38
                throw new ErrorException(sprintf(
39
                    'Failed to create directory "%s" with message "%s"',
40
                    $dir,
41
                    $error['message']
42
                ));
43
            }
44
45 1
            $configuration->setMigrationsDirectory($dir);
46
        } else {
47
            // class Kernel has method getKernelParameters with some of the important path parameters
48
            $pathPlaceholderArray = ['kernel.root_dir', 'kernel.cache_dir', 'kernel.logs_dir'];
49
50
            foreach ($pathPlaceholderArray as $pathPlaceholder) {
51
                if (! $container->hasParameter($pathPlaceholder) || ! preg_match('/\%' . $pathPlaceholder . '\%/', $dir)) {
52
                    continue;
53
                }
54
55
                $dir = str_replace('%' . $pathPlaceholder . '%', $container->getParameter($pathPlaceholder), $dir);
56
            }
57
58
            if (! is_dir($dir) && ! @mkdir($dir, 0777, true) && ! is_dir($dir)) {
59
                $error = error_get_last();
60
61
                throw new ErrorException(sprintf(
62
                    'Failed to create directory "%s" with message "%s"',
63
                    $dir,
64
                    $error['message']
65
                ));
66
            }
67
68
            $configuration->setMigrationsDirectory($dir);
69
        }
70
71 1
        if (empty($configuration->getMigrationsNamespace())) {
72 1
            $configuration->setMigrationsNamespace($container->getParameter('doctrine_migrations.namespace'));
73
        }
74
75 1
        if (empty($configuration->getName())) {
76 1
            $configuration->setName($container->getParameter('doctrine_migrations.name'));
77
        }
78
79
        // For backward compatibility, need use a table from parameters for overwrite the default configuration
80 1
        if (! ($configuration instanceof AbstractFileConfiguration) || empty($configuration->getMigrationsTableName())) {
81 1
            $configuration->setMigrationsTableName($container->getParameter('doctrine_migrations.table_name'));
82
        }
83
84 1
        $configuration->setMigrationsColumnName($container->getParameter('doctrine_migrations.column_name'));
85 1
        $configuration->setMigrationsColumnLength($container->getParameter('doctrine_migrations.column_length'));
86 1
        $configuration->setMigrationsExecutedAtColumnName($container->getParameter('doctrine_migrations.executed_at_column_name'));
87 1
        $configuration->setAllOrNothing($container->getParameter('doctrine_migrations.all_or_nothing'));
88 1
        $configuration->setCheckDatabasePlatform($container->getParameter('doctrine_migrations.check_database_platform'));
89
90
        // Migrations is not register from configuration loader
91 1
        if (! ($configuration instanceof AbstractFileConfiguration)) {
92 1
            $migrationsDirectory = $configuration->getMigrationsDirectory();
93
94 1
            if ($migrationsDirectory !== null) {
0 ignored issues
show
introduced by
The condition $migrationsDirectory !== null is always true.
Loading history...
95
                $configuration->registerMigrationsFromDirectory($migrationsDirectory);
96
            }
97
        }
98
99 1
        if (method_exists($configuration, 'getCustomTemplate') && empty($configuration->getCustomTemplate())) {
100 1
            $configuration->setCustomTemplate($container->getParameter('doctrine_migrations.custom_template'));
101
        }
102
103 1
        $organizeMigrations = $container->getParameter('doctrine_migrations.organize_migrations');
104
105
        switch ($organizeMigrations) {
106 1
            case Configuration::VERSIONS_ORGANIZATION_BY_YEAR:
107 1
                $configuration->setMigrationsAreOrganizedByYear(true);
108 1
                break;
109
110
            case Configuration::VERSIONS_ORGANIZATION_BY_YEAR_AND_MONTH:
111
                $configuration->setMigrationsAreOrganizedByYearAndMonth(true);
112
                break;
113
114
            case false:
115
                break;
116
117
            default:
118
                throw new InvalidArgumentException('Invalid value for "doctrine_migrations.organize_migrations" parameter.');
119
        }
120
121 1
        self::injectContainerToMigrations($container, $configuration->getMigrations());
122 1
    }
123
124
    /**
125
     * @param Version[] $versions
126
     *
127
     * Injects the container to migrations aware of it
128
     */
129 1
    private static function injectContainerToMigrations(ContainerInterface $container, array $versions) : void
130
    {
131 1
        foreach ($versions as $version) {
132
            $migration = $version->getMigration();
133
            if (! ($migration instanceof ContainerAwareInterface)) {
134
                continue;
135
            }
136
137
            $migration->setContainer($container);
138
        }
139 1
    }
140
}
141