portal.mkgtu.ru/backend/controllers/Migrate.php

111 lines
3.1 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace backend\controllers;
use console\controllers\PortalMigrateController;
use console\controllers\RbacMigrateController;
use Yii;
use yii\base\UserException;
class Migrate
{
const TYPE_DB = 'db';
const TYPE_RBAC = 'rbac';
protected $_migration_controller = null;
protected array $_migration_options = [];
public function __construct(string $type = Migrate::TYPE_DB)
{
switch ($type) {
case Migrate::TYPE_DB:
$this->_migration_controller = new PortalMigrateController('migrate', Yii::$app);
$this->_migration_options = [
'migrationTable' => '{{%system_db_migration}}',
'migrationPath' => '@common/migrations/db/',
];
break;
case Migrate::TYPE_RBAC:
$this->_migration_controller = new RbacMigrateController('rbac-migrate', Yii::$app);
$this->_migration_options = [
'migrationTable' => '{{%system_rbac_migration}}',
'migrationPath' => '@common/migrations/rbac/',
];
break;
default:
throw new UserException('unknown type: ' . $type);
}
}
public function checkAction($action)
{
$out_file = tempnam(__DIR__ . '/../runtime', 'tmp_out');
$out_stream = fopen($out_file, 'w');
$err_file = tempnam(__DIR__ . '/../runtime', 'tmp_err');
$err_stream = fopen($err_file, 'w');
$error_output = '';
ob_start();
try {
$this->_migration_controller->setStdOut($out_stream);
$this->_migration_controller->setStdErr($err_stream);
$this->_migration_controller->runAction(
$action,
array_merge(
$this->_migration_options,
[
'interactive' => false
]
)
);
$error_output = file_get_contents($err_file);
} catch (\Throwable $e) {
$error_output = $e->getMessage();
}
$verbose_output = ob_get_clean();
$message = trim(file_get_contents($out_file) . "\n{$error_output}\n{$verbose_output}");
$message = nl2br($message);
fclose($out_stream);
fclose($err_stream);
unlink($out_file);
unlink($err_file);
return $message;
}
public function applyNewMigrate()
{
$message = $this->checkAction('up');
if (strpos($message, 'Migrated up successfully.') !== false) {
$message = 'Все изменения применены успешно';
} else {
$message = 'Ошибка применения изменений к БД. <br />' . $message;
Yii::error(str_replace('<br />', '', $message));
}
return $message;
}
public function getNewMigrate()
{
return strpos($this->checkAction('new'), 'No new migrations found. Your system is up-to-date.') === false;
}
}