Fix MigrationRunner to properly detect migration class names from filenames

This commit is contained in:
Vladimir Mirivlad 2026-02-06 15:16:21 +00:00
parent 23a8dbcaf6
commit 1db39e1328
1 changed files with 31 additions and 15 deletions

View File

@ -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;