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