protected function bootstrapMigrations(InputInterface $input, OutputInterface $output)
{
$container = $this->getContainer();
$set = $input->getOption('set');
if (!isset($container['phpmig.migrations']) && !isset($container['phpmig.migrations_path']) && !isset($container['phpmig.sets'][$set]['migrations_path'])) {
throw new \RuntimeException($this->getBootstrap() . ' must return container with array at phpmig.migrations or migrations default path at phpmig.migrations_path or migrations default path at phpmig.sets');
}
$migrations = array();
if (isset($container['phpmig.migrations'])) {
if (!is_array($container['phpmig.migrations'])) {
throw new \RuntimeException($this->getBootstrap() . ' phpmig.migrations must be an array.');
}
$migrations = $container['phpmig.migrations'];
}
if (isset($container['phpmig.migrations_path'])) {
if (!is_dir($container['phpmig.migrations_path'])) {
throw new \RuntimeException($this->getBootstrap() . ' phpmig.migrations_path must be a directory.');
}
$migrationsPath = realpath($container['phpmig.migrations_path']);
$migrations = array_merge($migrations, glob($migrationsPath . DIRECTORY_SEPARATOR . '*.php'));
}
if (isset($container['phpmig.sets']) && isset($container['phpmig.sets'][$set]['migrations_path'])) {
if (!is_dir($container['phpmig.sets'][$set]['migrations_path'])) {
throw new \RuntimeException($this->getBootstrap() . " ['phpmig.sets']['" . $set . "']['migrations_path'] must be a directory.");
}
$migrationsPath = realpath($container['phpmig.sets'][$set]['migrations_path']);
$migrations = array_merge($migrations, glob($migrationsPath . DIRECTORY_SEPARATOR . '*.php'));
}
$migrations = array_unique($migrations);
$versions = array();
$names = array();
foreach ($migrations as $path) {
if (!preg_match('/^[0-9]+/', basename($path), $matches)) {
throw new \InvalidArgumentException(sprintf('The file "%s" does not have a valid migration filename', $path));
}
$version = $matches[0];
if (isset($versions[$version])) {
throw new \InvalidArgumentException(sprintf('Duplicate migration, "%s" has the same version as "%s"', $path, $versions[$version]->getName()));
}
$migrationName = preg_replace('/^[0-9]+_/', '', basename($path));
if (false !== strpos($migrationName, '.')) {
$migrationName = substr($migrationName, 0, strpos($migrationName, '.'));
}
$class = $this->migrationToClassName($migrationName);
if ($this instanceof GenerateCommand && $class == $this->migrationToClassName($input->getArgument('name'))) {
throw new \InvalidArgumentException(sprintf('Migration Class "%s" already exists', $class));
}
if (isset($names[$class])) {
throw new \InvalidArgumentException(sprintf('Migration "%s" has the same name as "%s"', $path, $names[$class]));
}
$names[$class] = $path;
require_once $path;
if (!class_exists($class)) {
throw new \InvalidArgumentException(sprintf('Could not find class "%s" in file "%s"', $class, $path));
}
$migration = new $class($version);
if (!$migration instanceof Migration) {
throw new \InvalidArgumentException(sprintf('The class "%s" in file "%s" must extend \\Phpmig\\Migration\\Migration', $class, $path));
}
$migration->setOutput($output);
// inject output
$versions[$version] = $migration;
}
if (isset($container['phpmig.sets']) && isset($container['phpmig.sets'][$set]['connection'])) {
$container['phpmig.connection'] = $container['phpmig.sets'][$set]['connection'];
}
ksort($versions);
return $versions;
}