Настраиваемая команда Phinx Symfony с загрузкой нескольких приложений

Я использую Phinx для выполнения миграции между сотнями приложений на нескольких серверах. Каждое приложение должно выполнять одинаковые миграции.

Для этого существует экземпляр приложения на центральном сервере, который знает обо всех конфигурациях и другой информации, необходимой для процесса начальной загрузки (который выполняется на основе applicationId).

Этот центральный экземпляр (давайте назовем это adminapp) выполняет команду и получает applicationIds через STDIN, а затем выполняет цикл, который загружает приложение и запускает команду миграции.

<?php
namespace Command\Db;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use App\Command\AppCommand;

class MigrateBulkCommand extends AppCommand
{

protected function configure()
{
$this
->setName('command:blah')
->setDescription('Executes SQL migrations accross multiple applications. Expects ApplicationIDs to be passed as new line delimited string on STDIN.')
;
}

protected function execute(InputInterface $input, OutputInterface $output)
{
$stdin = $this->getStdin();
if ($stdin === false) {
throw new \RuntimeException("Bulk migration command requires applicationIds to be passed to STDIN.");
}
$applicationIds = explode("\n", $stdin);

foreach($applicationIds as $applicationId) {
try {
$this->bootstrap($applicationId);
} catch (\Exception $e) {
$output->writeln(sprintf("<error>Bootstrap process failed for applicationId `%s`</error>", $applicationId));
}
$command = new \Phinx\Console\Command\Migrate();
$migrationInput = new \Symfony\Component\Console\Input\ArrayInput([

]);
$returnCode = $command->run($migrationInput, $output);
$output->writeln(sprinf("<info>Migrations for applicationId `%s` executed successfully.</info>", $applicationId));
}
}

}

Теперь Phinx ожидает, что его конфигурация будет представлена ​​в виде файла конфигурации. Я пытаюсь повторно использовать ресурс подключения к БД (PDO) и передать его команде Phinx. Phinx\Console\Command\Migrate на лету, вместе с именем БД.

Я видел в документации Phinx, что это вариант с конфигурационным файлом PHP, но я не могу найти способ сделать это на лету (во время Phinx\Console\Command\Migrate инициализация класса).

Phinx Doc предлагает:

require 'app/init.php';

global $app;
$pdo = $app->getDatabase()->getPdo();

return array('environments' =>
array(
'default_database' => 'development',
'development' => array(
'name' => 'devdb',
'connection' => $pdo
)
)
);

Есть ли способ без ужасного взлома передать ресурс соединения PDO и имя БД \Phinx\Console\Command\Migrate

0

Решение

В итоге я расширил класс Phinx Config \Phinx\Config\Config и создание метода fromArray,

$command = new \Phinx\Console\Command\Migrate();
$command->setConfig(\MyNamespace\Config::fromArray(
[
'paths' => [
'migrations' => APPLICATION_PATH . "/../db/migrations",
'seeds' => APPLICATION_PATH . "/../db/seeds"],
'environments' => [
'default_database' => 'production',
'production' => [
'name' => $db->get('dbname'),
'adapter' => 'mysql',
'host' => $db->get('host'),
'port' => $db->get('port'),
'user' => $db->get('username'),
'pass' => $db->get('password'),
]
]
]
));
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]