117 lines
4.0 KiB
PHP
Executable File
117 lines
4.0 KiB
PHP
Executable File
#!/usr/bin/env php
|
|
<?php
|
|
|
|
// Загрузка автозагрузчика Composer (если есть)
|
|
if (file_exists(__DIR__ . '/vendor/autoload.php')) {
|
|
require_once __DIR__ . '/vendor/autoload.php';
|
|
} else {
|
|
// Простая реализация автозагрузки для нашего случая
|
|
spl_autoload_register(function ($class) {
|
|
$prefix = 'App\\';
|
|
$len = strlen($prefix);
|
|
|
|
if (strncmp($prefix, $class, $len) !== 0) {
|
|
return;
|
|
}
|
|
|
|
$relativeClass = substr($class, $len);
|
|
$file = __DIR__ . '/src/' . str_replace('\\', '/', $relativeClass) . '.php';
|
|
|
|
if (file_exists($file)) {
|
|
require $file;
|
|
}
|
|
});
|
|
}
|
|
|
|
use App\MigrationRunner;
|
|
|
|
// Загрузка переменных окружения
|
|
if (file_exists(__DIR__ . '/.env')) {
|
|
$lines = file(__DIR__ . '/.env', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
|
|
foreach ($lines as $line) {
|
|
if (strpos($line, '=') !== false && strpos($line, '#') !== 0) {
|
|
list($key, $value) = explode('=', $line, 2);
|
|
$key = trim($key);
|
|
$value = trim($value);
|
|
if (!isset($_ENV[$key])) {
|
|
$_ENV[$key] = $value;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Загрузка конфигурации БД
|
|
$config = require_once __DIR__ . '/config/database.php';
|
|
|
|
try {
|
|
$dsn = "mysql:host={$config['host']};dbname={$config['database']};charset=utf8mb4";
|
|
$pdo = new PDO($dsn, $config['username'], $config['password'], [
|
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
|
PDO::ATTR_EMULATE_PREPARES => false,
|
|
]);
|
|
} catch (PDOException $e) {
|
|
die("Ошибка подключения к БД: " . $e->getMessage() . "\n");
|
|
}
|
|
|
|
$migrationRunner = new MigrationRunner($pdo);
|
|
|
|
// Обработка аргументов командной строки
|
|
$command = $argv[1] ?? null;
|
|
|
|
switch ($command) {
|
|
case 'migrate':
|
|
echo "Запуск миграций...\n";
|
|
$migrationRunner->migrate();
|
|
echo "Миграции завершены!\n";
|
|
break;
|
|
|
|
case 'rollback':
|
|
echo "Откат последней миграции...\n";
|
|
$migrationRunner->rollback();
|
|
echo "Откат завершен!\n";
|
|
break;
|
|
|
|
case 'status':
|
|
echo "Проверка статуса миграций...\n";
|
|
$stmt = $pdo->query("SELECT migration_name, applied_at FROM migrations ORDER BY applied_at ASC");
|
|
$appliedMigrations = $stmt->fetchAll();
|
|
|
|
if (empty($appliedMigrations)) {
|
|
echo "Нет примененных миграций.\n";
|
|
} else {
|
|
echo "Примененные миграции:\n";
|
|
foreach ($appliedMigrations as $migration) {
|
|
echo "- {$migration['migration_name']} ({$migration['applied_at']})\n";
|
|
}
|
|
}
|
|
|
|
// Показать непримененные миграции
|
|
$migrationFiles = glob(__DIR__ . '/migrations/*.php');
|
|
natsort($migrationFiles);
|
|
|
|
$appliedNames = array_column($appliedMigrations, 'migration_name');
|
|
$unapplied = [];
|
|
|
|
foreach ($migrationFiles as $file) {
|
|
$name = basename($file, '.php');
|
|
if (!in_array($name, $appliedNames)) {
|
|
$unapplied[] = $name;
|
|
}
|
|
}
|
|
|
|
if (!empty($unapplied)) {
|
|
echo "\nНепримененные миграции:\n";
|
|
foreach ($unapplied as $migration) {
|
|
echo "- $migration\n";
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
echo "Использование: php app.php [migrate|rollback|status]\n";
|
|
echo " migrate - применить все непримененные миграции\n";
|
|
echo " rollback - откатить последнюю миграцию\n";
|
|
echo " status - показать статус миграций\n";
|
|
exit(1);
|
|
} |