Completed
Pull Request — master (#228)
by Jonathan
02:55
created

DoctrineCommand   A

Complexity

Total Complexity 25

Size/Duplication

Total Lines 111
Duplicated Lines 0 %

Test Coverage

Coverage 50.88%

Importance

Changes 0
Metric Value
dl 0
loc 111
ccs 29
cts 57
cp 0.5088
rs 10
c 0
b 0
f 0
wmc 25

2 Methods

Rating   Name   Duplication   Size   Complexity  
A injectContainerToMigrations() 0 9 3
F configureMigrations() 0 93 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
89
        // Migrations is not register from configuration loader
90 1
        if (! ($configuration instanceof AbstractFileConfiguration)) {
91 1
            $migrationsDirectory = $configuration->getMigrationsDirectory();
92
93 1
            if ($migrationsDirectory !== null) {
94
                $configuration->registerMigrationsFromDirectory($migrationsDirectory);
95
            }
96
        }
97
98 1
        if (method_exists($configuration, 'getCustomTemplate') && empty($configuration->getCustomTemplate())) {
99 1
            $configuration->setCustomTemplate($container->getParameter('doctrine_migrations.custom_template'));
100
        }
101
102 1
        $organizeMigrations = $container->getParameter('doctrine_migrations.organize_migrations');
103
104
        switch ($organizeMigrations) {
105 1
            case Configuration::VERSIONS_ORGANIZATION_BY_YEAR:
106 1
                $configuration->setMigrationsAreOrganizedByYear(true);
107 1
                break;
108
109
            case Configuration::VERSIONS_ORGANIZATION_BY_YEAR_AND_MONTH:
110
                $configuration->setMigrationsAreOrganizedByYearAndMonth(true);
111
                break;
112
113
            case false:
114
                break;
115
116
            default:
117
                throw new InvalidArgumentException('Invalid value for "doctrine_migrations.organize_migrations" parameter.');
118
        }
119
120 1
        self::injectContainerToMigrations($container, $configuration->getMigrations());
121 1
    }
122
123
    /**
124
     * @param Version[] $versions
125
     *
126
     * Injects the container to migrations aware of it
127
     */
128 1
    private static function injectContainerToMigrations(ContainerInterface $container, array $versions) : void
129
    {
130 1
        foreach ($versions as $version) {
131
            $migration = $version->getMigration();
132
            if (! ($migration instanceof ContainerAwareInterface)) {
133
                continue;
134
            }
135
136
            $migration->setContainer($container);
137
        }
138 1
    }
139
}
140