From 1db39e13287e5230794aba7c31b37dfda035f177 Mon Sep 17 00:00:00 2001 From: Vladimir Mirivlad Date: Fri, 6 Feb 2026 15:16:21 +0000 Subject: [PATCH] Fix MigrationRunner to properly detect migration class names from filenames --- src/MigrationRunner.php | 46 +++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/src/MigrationRunner.php b/src/MigrationRunner.php index 5497a58..09ad4f9 100644 --- a/src/MigrationRunner.php +++ b/src/MigrationRunner.php @@ -136,23 +136,39 @@ class MigrationRunner return null; } - require_once $filename; - - $className = basename($filename, '.php'); - - // Попробуем найти класс в файле - $declaredClasses = get_declared_classes(); - $migrationClass = null; - - foreach ($declaredClasses as $declaredClass) { - if (strpos($declaredClass, $className) !== false) { - $migrationClass = $declaredClass; - break; - } + // Получаем имя класса из имени файла (001_create_base_tables.php -> CreateBaseTables) + $fileName = basename($filename, '.php'); + $classNameParts = explode('_', $fileName); + // Пропускаем номер (первую часть), если он числовой + if (is_numeric($classNameParts[0])) { + array_shift($classNameParts); + } + $className = ''; + foreach ($classNameParts as $part) { + $className .= ucfirst($part); } - if ($migrationClass && class_exists($migrationClass)) { - return new $migrationClass(); + // Проверяем, существует ли класс + if (!class_exists($className)) { + // Если класс не существует, подключаем файл + require_once $filename; + } + + // Проверяем снова, существует ли класс + if (class_exists($className)) { + return new $className(); + } + + // Если не нашли класс по преобразованному имени, пробуем другие подходы + $declaredClasses = get_declared_classes(); + foreach ($declaredClasses as $declaredClass) { + // Проверяем, не является ли класс потомком BaseMigration + $reflection = new \ReflectionClass($declaredClass); + if ($reflection->isSubclassOf('\App\BaseMigration') || + ($reflection->getName() === '\App\BaseMigration') || + $reflection->isSubclassOf('App\BaseMigration')) { + return new $declaredClass(); + } } return null;