CakePHP bakeによる高速開発 – 虎の巻

bakeとは?

「bake」とは、CakePHPのMVCによるWebアプリケーションの基本部分を自動生成するためのPHPスクリプトです。
対話型インターフェイスにより、基本的なMVC関係のファイルを超高速で作成することができます。

対話型インタフェースなので、以下のような感じで作業できます。

何を作りましょうか?
まずはモデルを作ってください。
承知しました。バリデーションやアソシエーションはこんな感じでいかがでしょうか?
はい、バッチリです。
モデル作りました。
どうも。次はコントローラを作ってください。
承知しました。一覧/追加/表示/編集/削除の基本的なコントローラを作ります。
はい。
コントローラ作りました。
どうも。次はビューを作ってください。
承知しました。一覧/追加/表示/編集と基本的なビューを作っておきますね。
はい。
ビュー作りました。
どうも。あ、アプリケーションできちゃった!

といった具合です。
ソースコードを書く必要は一切ありません。すごー

では、bakeによる高速開発をはじめましょう。

bakeする前の準備

サンプルで作成するWebアプリケーション

サンプルで作成するWebアプリケーションは、「CakePHP ACL アクセス制御リストを攻略する」の記事の中で「bakeしてね」で済ませてしまった、ユーザ管理部分を作りたいと思います。

機能はいたってシンプルで、「ロールとユーザについて、それぞれ crud(一覧/追加/表示/編集/削除)があって、User belongsTo Role の関係(各ユーザはいずれかのロールに属している)」というものです。

テーブルの作成

ユーザ管理を行う users テーブルと、ロール管理を行う roles テーブルを作成します。

CREATE TABLE IF NOT EXISTS `roles` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(4) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  `role_id` int(4) NOT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

CakePHPのインストール

サンプルでは XAMPPのローカルサーバを使い、c:¥xampp¥htdocs¥bake フォルダにCakePHPをインストールすることにします。

bakeを起動する

bakeを使うためには、まず、PHPがある場所と、bakeがある場所を環境変数PATHに登録しておく必要があります。
「なにそれ?」と思っても引き返さずに、以下の手順に従って作業してください。

1. コマンドプロンプトを起動

2. phpのある場所に移動

cd c:¥xampp¥php

※XAMPPの場合です。それぞれの環境に合わせて、PHP.EXEのある場所に移動してください。

3. PATH変数に追加

set path=%path%;%cd%

4. CakePHPフィルダの、cake フォルダ内にある console フォルダに移動

cd c:¥xampp¥htdocs¥bake¥cake¥console

5. 再び、PATH変数に追加

set path=%path%;%cd%

6. CakePHPディレクトリに移動

cd c:¥xampp¥htdocs¥bake

7. bake起動

cake bake

以下のように表示されたら、bake起動成功です。

Welcome to CakePHP v1.3.14 Console
—————————————————————
App : app
Path: C:¥xampp¥htdocs¥bake¥app
—————————————————————
Your database configuration was not found. Take a moment to create one.
—————————————————————
Database Configuration:
—————————————————————
Name:
[default] >

そのまま、つづきます。

データベース設定ファイルを作成

bakeを起動したら、まず最初にデータベース設定ファイルを作成します。

Name:
[default] >

「設定ファイルの名前は?」

設定ファイルの名前を聞かれているのですが、コマンドプロンプトにはすでに「[default] >」と表示されています。
bake が「これでいいんじゃないですか?」という答えをすでに用意してくれているのです。

はい、このままでいいので、なにも入力せずにEnterを押します。[default]

Driver:
[mysql] >

「ドライバーは?」

MySQLを使用することにしますので、そのままEnter。[mysql]

Persistent Connection:
[n] >

「持続的接続は行いますか?」

そのままEnter。[n]

Database Host:
[localhost] >

「データベースのホスト名は?」

そのままEnter。[localhost]

Port:
[n] >

「ポート番号は?」

そのままEnter。[n]

User:
[root] >

「データベースにアクセスするユーザ名は?」

そのままEnter。[root]
※データベースユーザを登録している場合はそれを入力。

Password:
>

「データベースにアクセスするパスワードは?」

そのままEnter。
※パスワードを設定している場合はそれを入力。

Database Name:
[cake] >

「データベースの名前は?」

データベース名を入力してEnter。

Table Prefix:
[n] >

「テーブルのプレフィックス(接頭語)は?」

そのままEnter。[n]

Table encoding:
[n] >

「テーブルの文字コードは?」

「utf8」と入力してEnter。

Look okay? (y/n)
[y] >

「以下の内容でよろしいですか?」

—————————————————————
The following database configuration will be created:
—————————————————————
Name: default
Driver: mysql
Persistent: false
Host: localhost
User: root
Pass: ****
Database: cake
Encoding: utf8
—————————————————————
Look okay? (y/n)
[y] >

内容を確認して間違いなければEnter。[y]

Do you wish to add another database configuration?
[n] >

「他のデータベース設定はありますか?」

他のデータベース設定はありませんので、そのままEnter。[n]

以上で、データベース設定ファイル(database.php)が作成されました。

app/config フォルダを開いて、database.php が作成されているのを確認してください。

中身も確認しておきましょう。

> app/config/database.php

<?php
class DATABASE_CONFIG {

	var $default = array(
		'driver' => 'mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'root',
		'password' => 'root',
		'database' => 'cake_bake',
		'encoding' => 'utf8'
	);
}
?>

できてるッ!!

引き続きMVCを作成していきます。

モデルの作成

再び「cake bake」を実行し、bakeを起動します。
(もしコマンドプロンプトを閉じてしまった場合には、最初からやり直しです。

Welcome to CakePHP v1.3.14 Console
—————————————————————
App : app
Path: ¥xampp¥htdocs¥bake¥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)
>

これが bake のメインメニュー画面です。

モデルを作成しますので、「m」を入力してEnter。

Possible Models based on your current database:
1. Role
2. User
Enter a number from the list above, type in the name of another model, or ‘q’ to exit

「どのモデルを作成しますか?」

データベースのテーブルから、作成可能なモデルを一覧で表示してくれます。
今回の場合、Role と User が選択肢にあると思います。

まずは User の番号を選択してEnter。[2]

A displayField could not be automatically detected would you like to choose one? (y/n)

「displayFieldを選択しますか?」

特に指定はないので「n」を入力してEnter。[n]

※displayField 属性は、どのフィールドをレコードのラベルとして使用するかを指定するものです。ラベルは scaffold や find(‘list’) の呼び出しで使用されます。デフォルトでは name または title が使用されます。

Would you like to supply validation criteria for the fields in your model? (y/n)
[y] >

「バリデーションを設定しますか?」

バリデーションも設定したいのでそのままEnter。[y]

各フィールドごとにバリデーションを設定していきます。

Field: id
Type: integer
—————————————————————
Please sélect one of the following validation options:
—————————————————————
1 – alphanumeric
2 – between
3 – blank
4 – boolean
5 – cc
6 – comparison
7 – custom
8 – date
9- decimal
10 – email
11 – equalto
12 – extension
13 – inlist
14 – ip
15 – maxlength
16 – minlength
17 – money
18 – multiple
19 – notempty
20 – numeric
21 – phone
22 – postal
23 – range
24 – ssn
25 – time
26 – url
27 – userdefined
28 – uuid
29 – Do not do any validation on this field.
… or enter in a valid regex validation string.
[29] >

「id フィールドのバリデーションを選択してください。」

まずは「id」フィールドですが、すでに[29]が選択されています。そのままEnter。
次はusername。「19 – notempty」がすでに選択されています。そのままEnter!

という具合に、bake があらかじめ「これでどうでしょう?」的なバリデーションルールを選択してくれていますので、実際は「そのままEnter」連打になります。

これをフィールドの数だけ繰り返します。

Whoud you like to define model associations (hasMany, hasOne, belongsTo, etc.)? (y/n)
[y] >

「アソシエーションを設定しますか?」

Userモデルは User bolongsTo Role のアソシエーション関係にありますので、「y」を入力してEnter。

User belongsTo Role. (y/n)
[y] >

これでいいので、「y」を入力してEnter。

Would you like to define some additional model associations? (y/n)
[n] >

「他にアソシエーションを設定しますか?」

他のアソシエーションは必要ないので、[n]を入力してEnter。

Look okey? (y/n)
[y] >

「以下の内容でよろしいですか?」

内容を確認して間違いなければ、「y」を入力してEnter。

—————————————————————
The following Model will be created:
—————————————————————
Name: User
DB Table: users
Validation: Array
(
  [username] => Array
    (
      [notenpty] => notempty
    )
  [password] => Array
    (
      [notempty] => notempty
    )
  [role_id] => Array
    (
      [numeric] => numeric
    )
)
Associations:
User belongsTo Role
—————————————————————
Look okay? (y/n)
[y] >

これで User モデルが作成されます。

SimpleTest is not installed. Do you want to bake unit test files anyway_ (y/n)
[y] >

「Userモデルを作成しました。テスト機能を用意しますか?」

テスト環境の構築については本記事では触れませんが、せっかくなので「y」を入力してEnter。

※「SimpleTest」というテストモジュールを入れてね、と言われると思いますが、今回は触れませんのでスルーでいいです。

app/models フォルダに、user.php が作成されているのを確認してください。

同様の手順で Role モデルも作成します。

コントローラの作成

bake のメインメニュー画面からはじめます。
コントローラを作成しますので、「c」を入力してEnter。

Enter a number from the list above, type in the name of another controller, or ‘q’ to exit

User を選択してEnter。[2]

Would you like to build your controller interactively? (y/n)

「インタラクティブ(対話型)に作成しますか?」

「y」を入力してEnter。

Would you like to user dynamic scaffolding? (y/n)

「scaffoldを使いますか?」

「n」を入力してEnter。

Would you like to create some basic class methods
(index(), add(), view(), edit())? (y/n)

「一覧/追加/表示/編集の基本的なコントローラを作成しますか?」

「y」を入力してEnter。

Would you like to create the basic class methods for admin routing? (y\n)

「アドミンルーティングを作成しますか?」

「n」を入力してEnter

Would you like this controller to user other helpers basides HtmlHelper and FormHelper? (y/n)

「HTMLヘルパーとFormヘルパー以外のヘルパー機能を使いますか?」

「n」を入力してEnter

Would you like this controller to use any components? (y/n)

「コンポーネントを使いますか?」

「n」を入力してEnter

Would you like to use Session flash messages? (y/n)

「セッションを使いますか?」

「y」を入力してEnter

Look okey? (y/n)

「以下の内容でよろしいですか?」

内容を確認して間違いなければ、「y」を入力してEnter。

これで、Userのコントローラが作成されました。

app/controllers」フォルダに、「users_controller.php」が作成されているのを確認してください。

ビューの作成

bake のメニュー画面からはじめます。
ビューを作成しますので、「v」を入力してEnter。

Enter a number from the list above, type in the name of another controller, or ‘q’ to exit.

User を選択してEnter。[2]

Would you like to create some CRUD view
(index. add, view, edit) for this controller?
NOTE: Before doing so, you’ll need to create your controller and model classes (including associated models). (y/n)

「一覧/追加/表示/編集の基本的なビューを作成しますか?」

「y」を入力してEnter。

Would you like to create the views for admin routing? (y/n)

「アドミンルーティングを作成しますか?」

「n」を入力してEnter。

これで、Userのビューが作成されました。

app/views」フォルダに、「users」というフォルダが作成され、その中に「add.ctp」「edit.ctp」「index.ctp」「view.ctp」というテンプレートが作成されているのを確認してください。

bakeされたアプリケーション

bakeで自動生成されたアプリケーションをブラウザで確認してみましょう。

一覧/追加/表示/編集/削除と、基本的な機能は備わっていますね。

bakeを使えば、この程度のアプリケーションは15分程度で開発できてしまいます。
あとは、この自動生成されたMVCファイルをカスタマイズしていけば良いわけです。

bakeにより、通常の方法で開発するよりも、はるかに高速に開発できることを体験してください。

bakeに慣れてきたら

bakeでの高速開発がディフォルトになってくると、bakeで自動生成されたMVCファイルをカスタマイズするのがめんどうに感じてくるかもしれません。
特にビューテンプレートは、bakeしても、結局すべて書き換えることが多いことに気づくかもしれません。

そうしたら、次の段階へ進み、さらなる効率化を目指しましょう。

bakeで自動生成されるMVCの”テンプレート”は、事前に用意しておくことが可能です。
すでに自分の開発テンプレートがあるならば、それをbakeのテンプレートとして設定しておけば、さらなる効率化が実現します。