目次
CakePHP 3 の migration コマンド について調べました。
環境
- PHP 5.5.9
- cakephp/cakephp 3.0.9
- cakephp/migrations 1.1.4
bake で使えるタスク
migration
次のように コマンドを実行すると migrate するための コード が生成されます。
1 |
php bin/cake.php bake migration xxxx |
コマンドの実態は SimpleMigrationTask.php
を継承した MigrationTask.php
で定義されています。 オプションの設定部分とあらかじめ定められたフォーマットを見てみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
/** * Gets the option parser instance and configures it. * * @return \Cake\Console\ConsoleOptionParser */ public function getOptionParser() { $name = ($this->plugin ? $this->plugin . '.' : '') . $this->name; $parser = new ConsoleOptionParser($name); $bakeThemes = []; foreach (Plugin::loaded() as $plugin) { $path = Plugin::classPath($plugin); if (is_dir($path . 'Template' . DS . 'Bake')) { $bakeThemes[] = $plugin; } } $parser->description( 'Bake migration class.' )->addOption('plugin', [ 'short' => 'p', 'help' => 'Plugin to bake into.' ])->addOption('force', [ 'short' => 'f', 'boolean' => true, 'help' => 'Force overwriting existing files without prompting.' ])->addOption('connection', [ 'short' => 'c', 'default' => 'default', 'help' => 'The datasource connection to get data from.' ])->addOption('theme', [ 'short' => 't', 'help' => 'The theme to use when baking code.', 'choices' => $bakeThemes ]); return $parser; } |
オプションは 親クラスの SimpleBakeTask
で定義されているものと同じです。 また、 --plugin
と -p
は同じオプションになります。
次にあらかじめ定められた migrate
のパターンを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
/** * Detects the action and table from the name of a migration * * @param string $name Name of migration * @return array **/ public function detectAction($name) { if (preg_match('/^(Create|Drop)(.*)/', $name, $matches)) { $action = strtolower($matches[1]) . '_table'; $table = Inflector::tableize(Inflector::pluralize($matches[2])); } elseif (preg_match('/^(Add).*(?:To)(.*)/', $name, $matches)) { $action = 'add_field'; $table = Inflector::tableize(Inflector::pluralize($matches[2])); } elseif (preg_match('/^(Remove).*(?:From)(.*)/', $name, $matches)) { $action = 'drop_field'; $table = Inflector::tableize(Inflector::pluralize($matches[2])); } elseif (preg_match('/^(Alter)(.*)/', $name, $matches)) { $action = 'alter_table'; $table = Inflector::tableize(Inflector::pluralize($matches[2])); } else { return null; } return [$action, $table]; } |
ここから、 CreateTable
、DropTable
、AddColumnToTable
、RemoveColumnFromTable
、AlterTable
の形が最初から使えるというのがわかりますね。 決められたフォーマットでなければ、 空のマイグレーションファイルができるので、そこに自分で必要な処理を追加します。
migration_snapshot
php bin/cake.php bake migration_snapshot snapshot_name
とやると テーブル構造のスナップショットが migration コード として作成されます。
オプションに require-table
というのが使用でき、 これを使用すると Table
クラス の存在するテーブルのみ スナップショット の対象になります。 標準では、データベースにあるテーブルがスナップショットの対象になります。
実際にやってみるとわかりますが、 Template/Bake/config/snapshot.php
を見るだけでもだいたい予想がつきます。
migrations で使えるコマンド
php bin/cake.php migrations COMMAND
で使用できるコマンドを見ていきます。 基本的に、 Command
ディレクトリの中にあるファイルを見ればいいです。
migrate
マイグレートを実行します。 target
オプション を使用して バージョンを指定すると、 指定されたバージョンのみマイグレートを行います。
rollback
最後に行われたマイグレートを元に戻します。 target
オプション を使用して バージョンを指定すると、 指定されたバージョンまでロールバックします。
status
マイグレーション一覧を、実行されたかされていないかを含めて出力します。
mark_migrated
マイグレーションを実行されたことにします。 php bin/cake.php migrations mark_migrated VERSION
とコマンドを実行します。 VERSION
のところは 対象マイグレーションファイルのバージョンにします。
CakePHP 3 の migration は phinx を継承しているので、 phinx のコードまで見ないとわからないことがあり、すべてを把握するのは大変です。