125 lines
4.5 KiB
PHP
Executable File
125 lines
4.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;
|
||
|
||
// Загрузка переменных окружения через Dotenv
|
||
$envPath = __DIR__ . '/.env';
|
||
if (file_exists($envPath)) {
|
||
echo "Файл .env найден\n";
|
||
} else {
|
||
echo "Файл .env НЕ найден по пути: $envPath\n";
|
||
exit(1);
|
||
}
|
||
|
||
try {
|
||
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
|
||
$dotenv->load();
|
||
echo ".env файл успешно загружен\n";
|
||
} catch (Exception $e) {
|
||
echo "Ошибка при загрузке .env файла: " . $e->getMessage() . "\n";
|
||
exit(1);
|
||
}
|
||
|
||
// Получение параметров подключения из переменных окружения
|
||
$host = $_ENV['DB_HOST'] ?? $_SERVER['DB_HOST'] ?? getenv('DB_HOST') ?? 'localhost';
|
||
$dbname = $_ENV['DB_NAME'] ?? $_SERVER['DB_NAME'] ?? getenv('DB_NAME') ?? 'your_database_name';
|
||
$username = $_ENV['DB_USER'] ?? $_SERVER['DB_USER'] ?? getenv('DB_USER') ?? 'your_database_user';
|
||
$password = $_ENV['DB_PASS'] ?? $_SERVER['DB_PASS'] ?? getenv('DB_PASS') ?? 'your_secure_password';
|
||
|
||
echo "Подключение к БД: host=$host, dbname=$dbname, user=$username\n";
|
||
|
||
try {
|
||
$dsn = "mysql:host=$host;dbname=$dbname;charset=utf8mb4";
|
||
$pdo = new PDO($dsn, $username, $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);
|
||
} |