rss_agent_hub/app.php

102 lines
3.5 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;
// Загрузка конфигурации БД
$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);
}