CakePHPでも作ってみる

CakePHP?

さて、ちょっとここでRuby on Railsを一旦離れてCakePHPでも似たようなことができるらしいので、
そっちを試してみようかと思う。
CakePHPというのはその名の通りPHPで動くフレームワークなのだが、Railsを意識して作られているらしい。
Ruby on Railsの開発効率はすばらしいのだが、RoRアプリケーションは実際に動かすにはFastCGIが使えるサーバーじゃないと遅くてやっていられないのに対し、こっちは純粋なPHPで書かれており特殊なライブラリ(PEARでさえも)が必要ないということで、レンタルサーバーで小規模なものを動かすにはなかなかよさそう。

CakePHPのインストール

CakePHPのインストールはものすごく簡単だった。
CakePHPのホームページ(http://www.cakephp.org/)からStable版1.1.14.4797をダウンロードし、あとはApacheで読める位置に解凍する。
その後、httpd.confを開いてmod_rewriteをロードするように設定してApacheを再起動する。

この状態でインストールしたディレクトリ(DocumentRoot/cake等)をブラウザから開いて下のような画面が表示されれば成功のようだ。

データベースの設定

次にRoR同様、データベース接続の設定をする
こちらは、app/configディレクトリにdatabase.phpを作ることで設定する。
app/configディレクトリには既にdatabase.php.defaultというファイルがあるので、それをコピーしてリネームして使うのが早い。

設定内容はRoRのdatabase.ymlとほぼ同じ。
適当にデータベース(cake_test)を作って、設定は以下のようにした。

class DATABASE_CONFIG
{
	var $default = array('driver' => 'mysql',
								'connect' => 'mysql_connect',
								'host' => 'localhost',
								'login' => 'hoge',
								'password' => 'hoge',
								'database' => 'cake_test',
								'prefix' => '');

	var $test = array('driver' => 'mysql',
								'connect' => 'mysql_connect',
								'host' => 'localhost',
								'login' => 'hoge',
								'password' => 'hoge',
								'database' => 'cake_test',
								'prefix' => '');
}

これを保存して、もう一度先ほどのcakeのトップを見ると今度は「Cake is able to connect to the database.」という文字が表示される。

テーブルを作る

RoR同様、まずはテーブルから作る。
ここでは、RoR掲示板と同じ構成のテーブルにしようと思うが、CakePHPの規約上RoRの「updated_at」にあたるマジックカラムは「modified」になるので、そこだけ変更する。

CREATE TABLE `articles` (
  `id` int(8) NOT NULL auto_increment,
  `modified` datetime NOT NULL,
  `name` varchar(255) NOT NULL,
  `title` varchar(255) NOT NULL,
  `body` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM;

bakeでscaffoldを作る

さて、RoR同様まずはscaffoldを作ろう。
RoRではscript/generateコマンドを使っていたが、CakePHPにはbakeというコマンドがあるのでこちらで作る。
ちなみに、ここの操作手順はRoRのscript/generateとは若干異なる。

まずはbakeを起動する。

php cake/scripts/bake.php

するとbakeのメニューが表示される。
RoRのscript/generateではscaffoldを指定することで一発でModel,Controller,Viewを生成できたが、
CakePHPの場合はそれぞれを別々に生成していく。

まずはModelから生成するので、最初のメニューでは「M」を選ぶ。

すると、データベースからモデルを生成可能なテーブルが検索される。

---------------------------------------------------------------
Model Bake:
---------------------------------------------------------------
Possible models based on your current database:
1. Articles

生成するモデルの番号を入力してくれといってくるので「1」を選択する。

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

RoRのgenerateと違うのは、このスクリプトでバリデーションの設定なども指定できる点だ。
まあ今回は面倒くさいので「n」でスキップする。

Would you like to define model associations (hasMany, hasOne, belongsTo, etc.)? (y/n)

次に他のモデルとの関係性を設定するか聞いてくるが、これも今回は必要ないので「n」でスキップ。
その後、確認画面がでてくるので内容を確認して「y」で先に進むとモデルが生成される。
なお、テストユニットをつくるか聞いてきても今回は場合は断っておけばよい。

php cake/scripts/bake.php

もう一度bakeを起動して、今度は「C」コントローラを作成する。

---------------------------------------------------------------
Controller Bake:
---------------------------------------------------------------
Possible Controllers based on your current database:
1. Articles

どのテーブルを元にするのか聞いてくるので、また「1」Articlesを選ぶ。

Would you like to build ... interactively?

と聞いてくるので、「y」を選ぶ。

Would you like to use scaffolding?

scaffoldを使いたいので「y」を選ぶ。

確認画面がでてくるので「y」、テストユニットは「n」で進むとコントローラの生成が完了。

php cake/scripts/bake.php

最後にもう一度bakeを起動して今度は「V」ビューを作る。
以下、モデル・コントローラ同様に質問に答えていく。

Would you like to create some scaffolded views for this controller?

には「y」で答える。

Would you like to create views .. admin routing?

は「n」でよい。

ちょっと長くなったがこれでscaffoldが完成。
ブラウザでcake/articles/にアクセスすると、生成されたscaffoldが表示される。
細かい点で色々挙動が異なる点があるが、基本的な機能はRoRで生成されたものとほとんど同じ。

長くて読みにくくなってきたので続きは明日にします。