/** * @return MigrationList */ public function loadMigrations() { $migration_dir = $this->config->get('directory'); if (!is_dir($migration_dir)) { throw new RuntimeError(sprintf('Given migration path is not a directory: %s', $migration_dir)); } $migration_list = new MigrationList(); $glob_expression = sprintf('%1$s%2$s[0-9]*%2$s%3$s', $migration_dir, DIRECTORY_SEPARATOR, self::GLOB_EXPRESSION); foreach (glob($glob_expression) as $migration_file) { $class_parser = new PhpClassParser(); $migration_class_info = $class_parser->parse($migration_file); $migration_class = $migration_class_info->getFullyQualifiedClassName(); if (!class_exists($migration_class)) { require_once $migration_class_info->getFilePath(); } if (!class_exists($migration_class)) { throw new RuntimeError(sprintf("Unable to load migration class %s", $migration_class)); } $class_name_parts = explode('_', $migration_class_info->getClassName()); $name = $class_name_parts[2] . (isset($class_name_parts[3]) ? $class_name_parts[3] : ''); $version = $class_name_parts[1]; $migration = $this->injector->make($migration_class, [':state' => ['name' => StringToolkit::asSnakeCase($name), 'version' => $version]]); $migration_list->addItem($migration); } return $migration_list; }
public function migrate($target_name = null, $target_version = null) { $executed_migrations = new MigrationList(); $direction = $this->getDirection($target_name, $target_version); if (!$direction) { return $executed_migrations; } $target_version = is_null($target_version) ? $this->getDefaultTargetVersion($target_name, $direction) : $target_version; if ($direction === MigrationInterface::MIGRATE_UP) { $migrations = $this->getPendingMigrations($target_name, $target_version); } else { $migrations = $this->getExecutedMigrations($target_name, $target_version); } foreach ($migrations as $migration) { $migration->migrate($this->getMigrationTarget($target_name), $direction); $executed_migrations->push($migration); } return $executed_migrations; }