コマンド

Phinx は多くのコマンドを使用して実行されます。

マイグレーションコマンド

init コマンド

init コマンド (initialize の略) は、Phinx のプロジェクトを準備するために使用されます。 このコマンドはプロジェクトディレクトリーのルートに phinx.yml ファイルを生成します。

$ cd yourapp
$ phinx init .

このファイルをテキストエディターで開き、プロジェクトの設定を行います。 詳しくは 設定 の章をご覧下さい。

create コマンド

create コマンドは、新しいマイグレーションファイルを作成するために使用されます。 1つの引数、つまりマイグレーション名が必要です。 マイグレーション名は、キャメルケース形式で指定する必要があります。

$ phinx create MyNewMigration

新しいマイグレーションファイルをテキストエディターで開き、データベースの変更を追加します。 Phinx は phinx.yml ファイルで指定されたパスを使ってマイグレーションファイルを作成します。 詳しくは 設定 の章をご覧下さい。

代替のテンプレートファイル名を指定することで、 Phinx が使用するテンプレートファイルを上書きすることができます。

$ phinx create MyNewMigration --template="<file>"

テンプレート生成クラスを提供することもできます。このクラスはインタフェース Phinx\Migration\CreationInterface を実装しなければなりません。

$ phinx create MyNewMigration --class="<class>"

マイグレーションのテンプレートを提供するだけでなく、クラスはマイグレーションファイルが テンプレートから生成されると呼び出されるコールバックを定義することもできます。

--template--class の両方を使用することはできません。

migrate コマンド

migrate コマンドは、すべての使用可能なマイグレーションを実行します。 オプションで特定のバージョンまで実行できます。

$ phinx migrate -e development

特定のバージョンにマイグレーションするには、 --target パラメーターまたは省略して -t を使用します。

$ phinx migrate -e development -t 20110103081132

--dry-run を使って、クエリーを実行せずに標準出力に出力します。

$ phinx migrate --dry-run

rollback コマンド

rollback コマンドは、Phinx によって実行された以前のマイグレーションを取り消すために使用されます。 これは、migrate コマンドの反対です。

引数を指定せずに rollback コマンドを使用すると、以前の移行にロールバックすることができます。

$ phinx rollback -e development

すべてのマイグレーションを特定のバージョンにロールバックするには、 --target パラメーターまたは 省略して -t を使用します。

$ phinx rollback -e development -t 20120103083322

ターゲットバージョンとして 0 を指定すると、すべてのマイグレーションが元に戻ります。

$ phinx rollback -e development -t 0

すべてのマイグレーションを特定の日付にロールバックするには、 --date パラメーターまたは省略して -d を省略して使用します。

$ phinx rollback -e development -d 2012
$ phinx rollback -e development -d 201201
$ phinx rollback -e development -d 20120103
$ phinx rollback -e development -d 2012010312
$ phinx rollback -e development -d 201201031205
$ phinx rollback -e development -d 20120103120530

ブレークポイントが設定され、さらにロールバックをブロックしている場合は、 --force パラメーターまたは -f を使ってブレークポイントをオーバーライドすることができます。

$ phinx rollback -e development -t 0 -f

--dry-run を使って、クエリーを実行せずに標準出力に出力します。

$ phinx rollback --dry-run

注釈

ロールバックすると、Phinx は phinx.yml ファイルの version_order オプションで 指定された順序で実行されたマイグレーションを処理します。 詳しくは 設定 の章をご覧下さい。

status コマンド

status コマンドは、すべてのマイグレーションのリストを現在のステータスとともに表示します。 このコマンドを使用して、実行されたマイグレーションを確認できます。

$ phinx status -e development

このコマンドは、データベースが最新の場合(つまり、すべてのマイグレーションが稼働している場合) コード0で終了します。またはそれ以外の場合は、次のコードのいずれかで終了します。

  • 1: 実行されるマイグレーションが少なくとも1つ残っています。
  • 2: マイグレーションが実行され、データベースに記録されましたが、マイグレーションファイルが有りません。

breakpoint コマンド

breakpoint コマンドは、ブレークポイントを設定するために使用され、ロールバックを制限することができます。 最新のマイグレーションのブレークポイントは、パラメーターを指定しないで切り替えることができます。

$ phinx breakpoint -e development

特定のバージョンでブレークポイントを切り替えるには、 --target パラメーターまたは省略して -t を使用します。

$ phinx breakpoint -e development -t 20120103083322

全てのブレークポイントを削除するには、 --remove-all パラメーターまたは省略して -r を使用します。

$ phinx breakpoint -e development -r

ブレークポイントは、 status コマンドを実行すると表示されます。

データベースの初期データ投入

seed:create コマンド

seed:create コマンドを使用して、新しいデータベースシードクラスを作成できます。 1つの引数、クラスの名前が必要です。クラス名はキャメルケース形式で指定する必要があります。

$ phinx seed:create MyNewSeeder

テキストエディターで新しいシードファイルを開き、データベースシードコマンドを追加します。 Phinx は phinx.yml ファイルで指定されたパスを使ってシードファイルを作成します。 詳しくは 設定 の章をご覧下さい。

seed:run コマンド

seed:run コマンドは、使用可能なすべてのシードクラスを実行するか、オプションで1つだけを実行します。

$ phinx seed:run -e development

シードクラスを1つだけ実行するには、 --seed パラメーターまたは省略して -s を使用します。

$ phinx seed:run -e development -s MyNewSeeder

設定ファイルパラメーター

コマンドラインから Phinx を実行するときは、 --configuration または -c パラメーターを使って設定ファイルを指定することができます。 YAML に加えて、設定ファイルは PHP 配列として PHP ファイルの計算された出力でもよいです。

<?php
    return [
        "paths" => [
            "migrations" => "application/migrations"
        ],
        "environments" => [
            "default_migration_table" => "phinxlog",
            "default_database" => "dev",
            "dev" => [
                "adapter" => "mysql",
                "host" => $_ENV['DB_HOST'],
                "name" => $_ENV['DB_NAME'],
                "user" => $_ENV['DB_USER'],
                "pass" => $_ENV['DB_PASS'],
                "port" => $_ENV['DB_PORT'],
            ]
        ]
    ];

Phinx は *.yml*.php 拡張子を持つファイルにどの言語パーサーを使うかを自動的に検出します。 適切なパーサーは、 --parser-p パラメーターで指定することもできます。 "php" 以外は YAML として扱われます。

PHP 配列を使用する場合、既存の PDO インスタンスに connection キーを提供することができます。 Phinx は hasTable() のような特定のメソッドに対してデータベース名を必要とするため、 データベース名も渡すことも重要です。

<?php
    return [
        "paths" => [
            "migrations" => "application/migrations"
        ],
        "environments" => [
            "default_migration_table" => "phinxlog",
            "default_database" => "dev",
            "dev" => [
                "name" => "dev_db",
                "connection" => $pdo_instance
            ]
        ]
    ];

ウェブアプリ内で Phinx を実行

Phinx は Phinx\Wrapper\TextWrapper クラスを使ってウェブアプリケーションの内部で 実行することもできます。この例は app/web.php で提供されています。 これはスタンドアロンサーバーとして実行できます。

$ php -S localhost:8000 vendor/robmorgan/phinx/app/web.php

これはデフォルトで現在のマイグレーションの状態を表示する http://localhost:8000 にローカルウェブサーバーを作成します。マイグレーションを実行するには、 http://localhost:8000/migrate を使用し、ロールバックには http://localhost:8000/rollback を使用します。

付属のウェブアプリは一例に過ぎません、本番環境では使用しないでください!

注釈

実行時に設定変数を変更し、 %%PHINX_DBNAME%% やその他の動的オプションを変更するには、 コマンドを実行する前に $_SERVER['PHINX_DBNAME'] を設定します。 使用可能なオプションは、設定ページに記載されています。

PHPUnit で Phinx を使用

Phinx は、ユニットテスト内でデータベースを準備またはシードするために使用できます。 プログラムによって使用することができます。

public function setUp ()
{
  $app = new PhinxApplication();
  $app->setAutoExit(false);
  $app->run(new StringInput('migrate'), new NullOutput());
}

メモリーデータベースを使用する場合は、Phinx に特定の PDO インスタンスを提供する必要があります。 Manager クラスを使用して Phinx と直接対話することができます。

use PDO;
use Phinx\Config\Config;
use Phinx\Migration\Manager;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Console\Input\StringInput;
use Symfony\Component\Console\Output\NullOutput;

class DatabaseTestCase extends TestCase {

    public function setUp ()
    {
        $pdo = new PDO('sqlite::memory:', null, null, [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        ]);
        $configArray = require('phinx.php');
        $configArray['environments']['test'] = [
            'adapter'    => 'sqlite',
            'connection' => $pdo
        ];
        $config = new Config($configArray);
        $manager = new Manager($config, new StringInput(' '), new NullOutput());
        $manager->migrate('test');
        $manager->seed('test');
        // シード後にデフォルトのフェッチモードを変更することができます
        $this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
        $this->pdo = $pdo;
    }

}