gorogoroyasu

福岡の開発会社で働いている。

Migration に書く処理を共通化した親クラスを作りたい

CakePHP3 のマイグレーションについて

CakePHP3 は、デフォルトで Phinx というマイグレーションツールを使用しています。

docs.phinx.org

マイグレーションファイルの雛形は以下のようになっており、

$ bin/cake migrations create MyCustomMigration

これを実行すると、

config/Migrations/20160121164955_my_custom.php

というファイルが作成されます。

ファイルの中身は、

<?php

use Migrations\AbstractMigration;

class MyCustomMigration extends AbstractMigration
{
    public function change()
    {
    }
}

のようになっています。

今回の話は、 extends AbstractMigration を変更したい という話です。

やるべきこと

親クラスを作る

config/Migrations/AppMigrations.php

<?php
namespace Config\Migrations;

use Migrations\AbstractMigration;

class AppMigrations extends AbstractMigration
{
    protected function commonUtil()
    {
        // 共通処理
    }
}

ドキュメント https://book.cakephp.org/3.0/ja/migrations.html#id2 にある通りに、カラムの情報を書こうとすると、 けっこうコードが長くなるので、割と共通化のしがいがあります。
特に、オプションとかは共通なものも多いでしょうし。

親クラスを継承する

config/Migrations/20160121164955_my_custom.php をちょこっと編集します。

<?php

// use Migrations\AbstractMigration; # 消す
                                                           
class MyCustomMigration extends AppMigrations // ← 変更する

composer.json を編集

    "autoload": {
        "psr-4": {
            "App\\": "src/",
            "Config\\": "config/" # この行を追加!
        }
    },

composer.json の autoloadに Config を追加します。

composer install

composer install をします。
これにより、 Config という名前の namespace が認識されます (詳細はよくわかってない)

以上! ここまでできたら、Migration を実行できます。

そこそこめんどくさいですが、 別で class を作ったりすると、 いちいち $table を渡さなくてはならなかったりして見た目が美しくありません。

Trait を使ったり、Plugin を使ったりと、他にも色々な方法はあると思いますが、
特定の案件だけで用いる特殊な処理を共通化したい場合は 今回のように親クラスを作ってあげるとさっと進めて良いのだろうなと思います。