container = $container; $this->store = $store; $this->namespace = $this->getMigrationsNamespace(); } public function runMigration(string $name): void { $className = $this->namespace . '\\' . $name; if (!class_exists($className)) { throw MigratorException::migrationClassNotFound($className); } if (!is_subclass_of($className, Migration::class)) { throw MigratorException::migrationClassIsNotASubclassOf($className, Migration::class); } try { $migration = new $className($this->container); $this->store->startMigration($name); $migration->run(); $this->store->completeMigration($name); } catch (Throwable $e) { $this->store->failMigration($name, (string)$e); throw MigratorException::migrationFailed($className, $e); } } private function getMigrationsNamespace(): string { $parts = explode('\\', MigrationTemplate::class); return implode('\\', array_slice($parts, 0, -1)); } }