カテゴリー
Linux

【PHP】phpmig で MySQL のマイグレーションをするまでの導入手順

ポイント

  • Pimple もインストールすること。さもないと、phpmig migrate 時に Fatal error: Class ‘Pimpli¥Container’ not found in … とエラーになった。
  • Pimple インストール方法については、phpmig の README には記載されていないので注意。

環境・バージョン

  • CentOS release 6.8 (final)
  • PHP 5.3.3 (cli) (built: Aug 11 2016 20:33:53)
  • Composer version 1.2.0 2016-07-19 01:28:52
  • davedevelopment/phpmig (v1.2.0)
  • pimple/pimple (v3.0.2)

お試し対象の MySQL データベース

  • DB 名: phpmigdb
  • ユーザ名: phpmiguser
  • パスワード: phpmigpassword

コマンドラインから、次のようにして作成いたしました。

mysql -u root -pvagrant <<EOT
GRANT ALL PRIVILEGES ON phpmigdb.* TO phpmiguser@localhost IDENTIFIED BY 'phpmigdbpassword';
FLUSH PRIVILEGES;
CREATE DATABASE phpmigdb CHARACTER SET utf8;
EOT

phpmig インストール手順

次のコマンドを実行して、Composer、phpmig、pimple をインストールいたします。

curl -sS https://getcomposer.org/installer | php
php composer.phar require davedevelopment/phpmig
php composer.phar require pimple/pimple ~3.0

実際の様子ですの。phpmig の前に Pimple をインストールしてしまいましたけれども、問題ありませんわ♪

$ curl -sS https://getcomposer.org/installer | php
Downloading 1.2.0...

Composer successfully installed to: /home/vagrant/composer.phar
Use it: php composer.phar
Some settings on your machine may cause stability issues with Composer.
If you encounter issues, try to change the following:

Your PHP (5.3.3) is quite old, upgrading to PHP 5.3.4 or higher is recommended.
Composer works with 5.3.2+ for most people, but there might be edge case issues.

The xdebug extension is loaded, this can slow down Composer a little.
Disabling it when using Composer is recommended.

$
$ php composer.phar require pimple/pimple ~3.0
You are running composer with xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug
Your version of PHP, 5.3.3, is affected by CVE-2013-6420 and cannot safely perform certificate validation, we strongly suggest you upgrade.
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing pimple/pimple (v3.0.2)
    Downloading: 100%

Writing lock file
Generating autoload files
$
$ php composer.phar require davedevelopment/phpmig
Your version of PHP, 5.3.3, is affected by CVE-2013-6420 and cannot safely perform certificate validation, we strongly suggest you upgrade.
You are running composer with xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug
Using version ^1.2 for davedevelopment/phpmig
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing symfony/class-loader (v2.6.13)
    Downloading: 100%

  - Installing symfony/filesystem (v2.6.13)
    Downloading: 100%

  - Installing symfony/config (v2.6.13)
    Downloading: 100%

  - Installing symfony/yaml (v2.6.13)
    Downloading: 100%

  - Installing symfony/console (v2.6.13)
    Downloading: 100%

  - Installing davedevelopment/phpmig (v1.2.0)
    Downloading: 100%

symfony/console suggests installing symfony/event-dispatcher ()
symfony/console suggests installing symfony/process ()
symfony/console suggests installing psr/log (For using the console logger)
Writing lock file
Generating autoload files
$

phpmig 初期化

次の初期化コマンドを実行することで、設定などを記載するブートストラップファイル phpmig.php と、マイグレーションファイルを入れるディレクトリ migrations が作成されます。

vendor/bin/phpmig init

実際の様子ですわ。

$ vendor/bin/phpmig init
+d ./migrations Place your migration files in here
+f ./phpmig.php Create services in here
$

ブートストラップファイル phpmig.php の編集

init コマンドで作られたファイルは、次のようになりました。

<?php

use \Phpmig\Adapter;

$container = new ArrayObject();

// replace this with a better Phpmig\Adapter\AdapterInterface
$container['phpmig.adapter'] = new Adapter\File\Flat(__DIR__ . DIRECTORY_SEPARATOR . 'migrations/.migrations.log');

$container['phpmig.migrations_path'] = __DIR__ . DIRECTORY_SEPARATOR . 'migrations';

// You can also provide an array of migration files
// $container['phpmig.migrations'] = array_merge(
//     glob('migrations_1/*.php'),
//     glob('migrations_2/*.php')
// );

return $container;

このままでは、MySQL に接続することができません。また、Pimple を使用するようにもなっておりません。

これを次のように修正いたしました。Pimple を導入し、DB接続設定を追記していますの。

<?php

use \Phpmig\Adapter;
use Pimple\Container;

$container = new Container();

$container['db'] = function () {
    $dbh = new PDO('mysql:dbname=phpmigdb;host=127.0.0.1','phpmiguser','phpmigdbpassword');
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    return $dbh;
};

// replace this with a better Phpmig\Adapter\AdapterInterface
$container['phpmig.adapter'] = new Adapter\File\Flat(__DIR__ . DIRECTORY_SEPARATOR . 'migrations/.migrations.log');

$container['phpmig.migrations_path'] = __DIR__ . DIRECTORY_SEPARATOR . 'migrations';

// You can also provide an array of migration files
// $container['phpmig.migrations'] = array_merge(
//     glob('migrations_1/*.php'),
//     glob('migrations_2/*.php')
// );

return $container;

これで、準備完了です♪

phpmig を使用する。

phpmig_test テーブルを migrate コマンドで作成し、rollback コマンドで削除してみます。

マイグレーションファイルの雛形を作成し、編集

vendor/bin/phpmig generate AddTestTable

実践しますと、指定した名前をベースにファイルが生成されたことがわかります。

$ vendor/bin/phpmig generate AddTestTable
+f ./migrations/20160831055626_AddTestTable.php
$

このマイグレーションファイルの up および down メソッド内を作っていきます。

  • up メソッドにphpmig_tesr テーブル作成実行を記述
  • down メソッドにphpmig_tesr テーブル削除実行を記述

次のようになりました。

<?php

use Phpmig\Migration\Migration;

class AddTestTable extends Migration
{
    /**
     * Do the migration
     */
    public function up()
    {
        $sql = "CREATE TABLE `phpmig_test` (id INTEGER, name TEXT);";
        $container = $this->getContainer();
        $container['db']->query($sql);
    }

    /**
     * Undo the migration
     */
    public function down()
    {
        $sql = "DROP TABLE IF EXISTS `phpmig_test`;";
        $container = $this->getContainer();
        $container['db']->query($sql);
    }
}

マイグレーション実施

vendor/bin/phpmig migrate

実行しますと、次のようになりました。これで成功です!なお、失敗した場合は、エラーが、実施されなかった場合は何も表示されませんでした。

$ vendor/bin/phpmig migrate
 == 20160831055626 AddTestTable migrating
 == 20160831055626 AddTestTable migrated 0.0402s
$

データベースを見てみると、確かにテーブルが作成されておりました!

ロールバック実施

vendor/bin/phpmig rollback

実行すると、migrate の時と同じように表示され、成功したことがわかります♪

$ vendor/bin/phpmig rollback
 == 20160831055626 AddTestTable reverting
 == 20160831055626 AddTestTable reverted 0.0018s
$

もちろん、データベースを確認してみるとテーブルが削除されておりました♪

おわりに

次のページが参考になりました。ありがとう存じます!

日本語の情報は数年前以上のものが大半で、実情とは変わってきているため、そのまま使えずエラーとなる場合がありました><。

加えて、Composer の使い方が、phpmig を使えるようになった今でもですけれども、よく理解していないために、Pimple も合わせてインストールする必要性に気が付かず、時間がかかってしまいました><。

ですので、今回ははじめから丁寧に一通りの使い方をノートいたしました。

以上です。

コメントを残す