Bakeでコード生成

CakePHPのBakeは、あなたがやることを代わりにCakePHPにまかせることができます。BakeはCakePHPの基本的な素材(モデル、ビュー、コントローラ)を作れます。Bakeでは、簡単にフル機能をそなえたアプリケーションを作ることができますがそういったスケルトンクラスについてはここでは話しません。またScaffoldアプリケーションを試してみるのに、bakeを使ってみるのもいいでしょう。

Bakeのセットアップに関する情報は(特にWindowsユーザーは)Bake screencast を参照してください。

セットアップ環境に依っては、cakeスクリプトに実行権限を設定したり ./cake bake として、呼び出したりする必要があります。cakeスクリプトはPHP CLI(command line interface)で実行されます。スクリプト実行に問題があれば、PHP CLIがインストールされていることと、適切なモジュール(たとえばMySQLなど)がインストールされていることを確認してください。

はじめてBakeを実行する時に、まだデータベースの設定ファイルがなければそれを作るように促されます。

データベース設定ファイルを作ったあと、Bakeを実行すると次のようなオプションが表示されます。

---------------------------------------------------------------
App : app
Path: /path-to/project/app
---------------------------------------------------------------
Interactive Bake Shell
---------------------------------------------------------------
[D]atabase Configuration
[M]odel
[V]iew
[C]ontroller
[P]roject
[F]ixture
[T]est case
[Q]uit
What would you like to Bake? (D/M/V/C/P/F/T/Q)
>

代わりに、次のようにコマンドラインから直接これらのコマンドを実行することが出来ます。

$ cake bake db_config
$ cake bake model
$ cake bake view
$ cake bake controller
$ cake bake project
$ cake bake fixture
$ cake bake test
$ cake bake plugin plugin_name
$ cake bake all

bakeテンプレートから生成されるデフォルトのHTMLを変更する

bakeコマンドで生成されるデフォルトのHTMLの出力を変更したい場合、次のようなステップでやります。

カスタムビューを作る

  1. lib/Cake/Console/Templates/default/views に移動します。
  2. その中に、4つのファイルがあります。
  3. それらのファイルを app/Console/Templates/[themename]/views にコピーします。
  4. HTMLに変更を加えます。

[themename] は、自分で自由につけれるbakeのテーマ名です。 bakeのテーマ名はユニークである必要がありますので、’default’は使わないでください。

カスタムプロジェクトを作る

  1. lib/Cake/Console/Templates/skel に移動します。
  2. その中に、アプリケーションのベースとなるファイルがあります。
  3. それらのファイルを app/Console/Templates/skel にコピーします。
  4. HTMLに変更を加えます。

projectタスクにスケルトンのパスをパラメータとして渡します。

cake bake project --skel Console/Templates/skel

ノート

  • cake bake project は、スケルトンのパスをパラメータで渡して特定のprojectタスクを実行します。
  • テンプレートのパスはコマンドラインのカレントパスからの相対パスです。
  • スケルトンまでのフルパスを入力すれば、自分が使いたいテンプレートがあるディレクトリであればどこでも指定できます。(ビューのように、Cakeがスケルトンディレクトリのオーバーライドをサポートしない限り)

Bakeの改善

1.3用のbakeは、改善の余地が大いにありました。そのため、数多くの機能や改善が組み込まれました。

  • 新しく2つのタスク(FixtureTaskとTestTask)が、bakeのメインメニューから呼び出せるようになりました。
  • TemplateTaskが、シェルの中で使えるようになりました。
  • すべてのbakeタスクは、 -connection パラメータを使ってbakeするためのデフォルト以外の接続を使えるようになりました。
  • プラグインのサポートが改善されました。-plugin PluginName または Plugin.class のどちらとも使えます。
  • bakeでの質問が明確になり、より理解しやすくなりました。
  • モデルでの複数バリデーションがサポートされました。
  • parent_id を使ったセルフアソシエーションのモデルが検出されるようになりました。たとえば、モデル名がThreadの場合、ParentThreadとChildThreadのアソシエーションが作られます。
  • FixturesとTestsはそれぞれbakeすることが出来るようになりました。
  • bakeされたTestsには、bakeが認識しているフィクスチャやプラグインが検出されて、それらが含まれます。(ただしプラグインの検出はPHP4では動作しません)

このように洗練された様々な機能があります。新しいコマンドやパラメータ、より便利になった機能の数々を見ていくことにしましょう。

FixtureTask, TestTask, TemplateTask

昔は、フィクスチャとテストをbakeするのは、ちょっと大変でした。テストはクラスをbakeする時にしか生成できませんでしたし、フィクスチャはモデルをbakeする時にしか生成できませんでした。これでは、アプリケーションにテストを追加する作業がおろそかになったり新しいスキーマでフィクスチャを再生成するのが面倒です。1.3では、フィクスチャとテストを分割して、それぞれを別々のタスクとしていました。これでは、開発の要所要所でフィクスチャやテストの再実行や再生成をしないといけません。

しかし現在は、常にそれらを再構築しやすい環境であることに加えて、テストをbakeする時は見つけれる限りのフィクスチャを探そうとします。昔はテストを実施するには、大量の’Missing Table’エラーを潰さないといけませんでした。この、フィクスチャを自動検出する仕組みで、テストがよりやりやすくなります。

テストケースについても、クラス中にある継承されていないpublicなメソッド毎にスケルトンテストメソッドを生成します。これで実際にやる作業がまた1つ減ります。

TemplateTask は、シーンタスクの裏側でテンプレートからファイルを生成する操作を行います。CakePHPの過去のbakeでは、ビューはテンプレートをベースにしたものでしたが他のコードはそうではありませんでした。1.3では、bakeされて生成されるファイルはほとんどすべて、テンプレートと TemplateTask によってコントロールされます。

FixtureTask はダミーデータを生成するだけではなく、 -records オプションを使って実際のデータからフィクスチャを生成することも出来ます。

新しいbakeコマンド

bakeをより早く、より簡単にするために新しいコマンドが追加されました。 コントローラ、モデル、ビューについて、すべての機能をbakeする all というサブコマンドです。 これは、一度にすべての素材を作ってくれて、また再作成も簡単に出来ます。

cake bake model all

このコマンドは一回ですべてのモデルをbakeします。 同じように、 cake bake controller all はすべてのコントローラーを、cake bake view all はすべてのビューファイルを生成します。 ControllerTask 上のパラメータも同様に変更されます。 cake bake controller scaffoldcake bake controller public になりました。 ViewTask-admin フラグが追加され、このフラグを使うとRouting.admin を使ったビューのアクションをbakeできます。

前述のように、 cake bake fixturecake bake test は新しく追加され、それぞれにいくつかのサブコマンドができました。cake bake fixture all はアプリケーション中のすべてのフィクスチャを生成します。-count パラメータを指定すると、その分だけフェイクレコードをセットできます。フィクスチャタスクを実行することで、実際のテーブルのデータを使ってフィクスチャを生成できます。アプリケーション中で既に作られているオブジェクトに対するテストケースを作るためにはcake bake test <type> <class> が使えます。typeはCakePHPのタイプ(‘component’, ‘controller’, ‘model’, ‘helper’, ‘behavior’)の内の1つを指定するべきですが、それ以外でもかまいません。classはtypeで選んだ中から、存在するオブジェクトを指定します。

豊富なテンプレート

1.3の新しいbakeはより多くのテンプレートが追加されています。テンプレートは、bakeでアウトプットを生成するのに使われていました。1.2からすると、コントローラ、コントローラのアクション、フィクスチャ、モデル、テストケース、ビューのテンプレートは、分割されます。複数のテンプレートやbakeのテーマをセットすることもできます。bakeテーマはアプリケーションまたはプラグインの一部として使うことができます。bakeテーマのプラグインは app/Plugin/BakeTheme/Console/Templates/dark_red/ のようなパスに配置します。

blue_bunny というbakeテーマは app/Console/Templates/blue_bunny にあります。lib/Cake/Console/Templates/default/ を見ればbakeテーマに必要なファイルやディレクトリの構造がどうなっているかがわかります。しかし、ビューファイルのように、bakeテーマがテンプレートを実装していなければ正しいテンプレートが見つかるまで、インストールされている他のテーマがチェックされていきます。

プラグインのサポート

1.3ではbakeするとき、プラグイン名を指定するための新しい方法があります。cake bake plugin Todo controller Posts とするために、次の2つのやりかたがあります。cake bake controller Todo.Postscake bake controller Posts -plugin Todo です。たとえば、 cake bake controller -plugin Todo はインタラクティブにbakeを使ってTodoプラグインにコントローラを追加することができます。複数のプラグインパスもサポートされています。過去のbakeでは、app/pluginsにプラグインを読み込んでいました。1.3のbakeではプラグインが配置されているパスを探して、そこにファイルを追加します。