ARUNOX Framework

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:

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";
			}
		}
	}