0

Phinx を使用して、複数のサーバー上の数百のアプリケーションにわたって移行を実行しています。すべてのアプリケーションは同じ移行を実行する必要があります。

これを行うには、ブートストラップ プロセス (applicationId に基づいて行われます) を実行するために必要なすべての構成とその他の情報を認識している中央サーバーにアプリのインスタンスがあります。

その中央インスタンス ( adminappと呼びましょう) はコマンドを実行し、STDIN を介して applicationIds を受け取り、アプリケーションをブートストラップして移行コマンドを実行するループを実行します。

<?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 は、その構成が構成ファイルの形式で存在することを期待しています。私がやろうとしているのは、DB 接続リソース (PDO) を再利用Phinx\Console\Command\Migrateし、その場で Phinx コマンドに db 名と共に渡すことです。

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

4

1 に答える 1

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'),
            ]
        ]
    ]
));
于 2016-10-13T09:45:10.787 に答える