Migration に書く処理を共通化した親クラスを作りたい
CakePHP3 のマイグレーションについて
CakePHP3 は、デフォルトで Phinx というマイグレーションツールを使用しています。
マイグレーションファイルの雛形は以下のようになっており、
$ 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 を使ったりと、他にも色々な方法はあると思いますが、
特定の案件だけで用いる特殊な処理を共通化したい場合は
今回のように親クラスを作ってあげるとさっと進めて良いのだろうなと思います。