带有多个应用程序的自定义 Phinx Symfony 命令 bootstrap
Customized Phinx Symfony command with multiple app bootstrap
我正在使用 Phinx 在多个服务器上执行跨 100 个应用程序的迁移。每个应用程序都应该执行相同的迁移。
为了做到这一点,中央服务器上有一个应用程序实例,它知道执行 bootstrap 过程所需的所有配置和其他信息(这是基于 applicationId 完成的)。
该中央实例(我们称它为 adminapp)执行命令并通过 STDIN 接收 applicationIds,然后执行一个循环 bootstraps 应用程序并运行迁移命令。
<?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
class 初始化).
Phinx 文档建议:
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
我最终扩展了 Phinx Config class \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'),
]
]
]
));
我正在使用 Phinx 在多个服务器上执行跨 100 个应用程序的迁移。每个应用程序都应该执行相同的迁移。
为了做到这一点,中央服务器上有一个应用程序实例,它知道执行 bootstrap 过程所需的所有配置和其他信息(这是基于 applicationId 完成的)。
该中央实例(我们称它为 adminapp)执行命令并通过 STDIN 接收 applicationIds,然后执行一个循环 bootstraps 应用程序并运行迁移命令。
<?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
class 初始化).
Phinx 文档建议:
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
我最终扩展了 Phinx Config class \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'),
]
]
]
));