Phpmig\Console\Command\AbstractCommand::bootstrapMigrations PHP Method

bootstrapMigrations() protected method

protected bootstrapMigrations ( Symfony\Component\Console\Input\InputInterface $input, Symfony\Component\Console\Output\OutputInterface $output )
$input Symfony\Component\Console\Input\InputInterface
$output Symfony\Component\Console\Output\OutputInterface
    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;
    }