CakePHP3のBakeコマンドで生成されるファイルをカスタマイズする

TL;DR

CakePHP3 の bake コマンドで生成されるファイルの内容をカスタマイズしたい場合、対応するテンプレートファイルを src 以下にコピーして追加して内容を書き換えるだけでカスタマイズできます。

Model ファイルを bake する例

まずは通常通り Model 関連ファイルを作成するコマンドです。
テーブル名が users の場合は以下のようなコマンドを実行すると焼き上がります。

bin/cake bake model Users

実行すると以下4ファイルが生成されます。

  • src/Model/Table/UsersTable.php (Table)
  • src/Model/Entity/User.php (Entity)
  • tests/Fixture/UsersFixture.php (Fixture)
  • tests/TestCase/Model/Table/UsersTableTest.php (TestCase)

生成されるファイルの内容を一部カスタマイズする方法

上記のコマンドで生成されるファイルのコード内容を一部書き換えたい場合どうすればいいでしょうか?
例えば Table クラスファイルの内容を書き換えたい場合、以下の手順で出来ます。

  1. vendor/cakephp/bake/src/Template/Bake/Model/table.ctp にあるファイルをコピーする(通常はこのファイルを元に生成が行われる)
  2. コピーしたファイルを src/Template/Bake/Model/table.ctp に貼り付ける
  3. 貼り付けたファイルの内容の書き換えたい箇所を書き換える

この状態で bake コマンドを実行するとコピーした ctp ファイルを元にクラスファイルの生成が行われます。
Entity クラスや Controller クラスなどを書き換えたい場合も同様の方法で可能です。

ctp ファイルの書き方やその他詳しい情報は CakePHP 公式ドキュメントの Extending Bake — CakePHP Cookbook 3.x documentation を参照してください。

更にカスタマイズをしたい場合

更なるカスタマイズをしたい場合、ここでは詳しく説明しませんが bake 用の Theme Plugin を作成してそれを bake 時に有効にして適用する方法や、新しい bake コマンドオプションを作ってしまう方法などがあります。

例えば Bake\Shell\Task\SimpleBakeTask クラスを継承して FooBakeTask クラスを作成することで、以下のようなコマンドを実行できるようになります。

bin/cake bake foo

やろうと思えば専用のコマンドラインオプションの追加実装なども出来るため、かなり自由度の高いカスタマイズが出来そうです。