ARUNOX\Migrations\Manager
Diese Dokumentation beschreibt die Klasse Migrations\Manager, die für die Verwaltung und Ausführung von Datenbankmigrationen im ARUNOX-Framework verantwortlich ist.
Einleitung
Die Klasse Migrations\Manager bietet Methoden zur Initialisierung von Migrationspfaden, zur Verwaltung von Abhängigkeiten und zum Ausführen ausstehender Migrationen.
Strukturübersicht
Die Klasse Migrations\Manager befindet sich im folgenden Verzeichnis:
library/ARUNOX/Migrations/Manager.php
Voraussetzungen
Folgende Voraussetzungen müssen erfüllt sein, um die Klasse erfolgreich nutzen zu können:
- Die Datenbank muss korrekt konfiguriert sein.
- Die Klasse
Migrations\Entitymuss verfügbar sein. - Die Konstanten
ROOT_DIRundPLUGINS_DIRmüssen definiert sein.
Anwendung
So verwenden Sie die Klasse Migrations\Manager:
Initialisierung der Migrationspfade
require_once 'config/init.php';
use ARUNOX\Migrations\Manager;
Manager::init([
ROOT_DIR,
PLUGINS_DIR
]);
Ausstehende Migrationen ausführen
Manager::run();
Sourcecode
Pfad: library/ARUNOX/Migrations/Manager.php
<?php
/**
* ARUNOX\Migrations\Manager
*
* Handles database migrations, including plugin-specific migrations.
* Utilizes the Entity for database interactions.
* Automatically identifies and executes pending migrations.
*
* @version 1.0.0
* @version 1.0.0
*/
namespace ARUNOX\Migrations;
use Exception;
class Manager
{
private static array $directories = [];
private static Entity $entity;
/**
* Initializes the Manager with root directories for migrations.
*
* @param array $rootDirs
*/
public static function init(array $rootDirs): void
{
foreach ($rootDirs as $root) {
self::$directories[] = rtrim($root, '/') . '/migrations';
}
self::$entity = new Entity();
self::$entity->initTable();
}
/**
* Runs all pending migrations.
*/
public static function run(): void
{
$applied = self::$entity->getApplied();
$files = self::getFiles();
foreach ($files as $file) {
$name = basename($file, '.php');
if (!in_array($name, $applied)) {
self::execute($file, $name);
}
}
}
/**
* Finds all migration files in the specified directories.
*
* @return array
*/
private static function getFiles(): array
{
$files = [];
foreach (self::$directories as $dir) {
if (is_dir($dir)) {
$files = array_merge($files, glob($dir . '/*.php'));
}
}
return $files;
}
/**
* Executes a single migration file.
*
* @param string $file
* @param string $name
*/
private static function execute(string $file, string $name): void
{
try {
Database::begin();
require_once $file;
if (!class_exists($name)) {
throw new Exception("Migration class {$name} not found in {$file}");
}
$migration = new $name();
if (!$migration instanceof Migration) {
throw new Exception("Migration class {$name} must extend the abstract Migration class");
}
$migration->up();
self::$entity->record($name);
Database::commit();
echo "Migration {$name} executed successfully.\n";
} catch (Exception $e) {
Database::rollback();
echo "Migration {$name} failed: " . $e->getMessage() . "\n";
}
}
}