<a href="http://atnd.org/events/22721" target="_blank">CakePHP Advent Calendar 2011</a>に触発されたので、「勝手にCakePHP Advent Calendar 2011」ということにして記事を書いてみます。
お題は「CakePHP2.0の初期設定とcakeをbakeで焼きましょう」です。
CakePHPをインストール
とりあえずCakePHPを落とします。 2.0系を使いたかったので、僕がやったときの最新の安定版である2.0.4にしました。 [bash] wget --no-check-certificate https://github.com/cakephp/cakephp/zipball/2.0.4 mv 2.0.4 cakephp.2.0.4.zip unzip cakephp.2.0.4.zip mv cakephp-cakephp-ec45e4e cakephp [/bash] 必要なさそうなファイルは削除しておきます。 [bash] cd cakephp rm README rm .gitignore [/bash] 今回は http://tnnsst35.me/cakephp/ にアクセスすることを前提に話を進めていきます。 作ったcakephp直下に http://tnnsst35.me/cakephp/ でアクセスできるように移動しておきます。 ※なお、実際にこのURLにアクセスしてもなにも出てきません。自分用に置き換えてください。
CakePHPの初期設定
ブラウザからアクセスするときっとエラーが続出するので直していきます。
※緑が正常。黄は警告。赤はエラーです。黄と赤がなくなればOKです。
Please change the value of 'Security.salt' in app/Config/core.php to a salt value specific to your application 187行目 app/Config/core.php [php] Configure::write('Security.salt', 適当な文字列に変更する); [/php]
Please change the value of 'Security.cipherSeed' in app/Config/core.php to a numeric (digits only) seed value specific to your application 192行目 app/Config/core.php [php] Configure::write('Security.cipherSeed', 適当な数字列に変更する); [/php]
Your tmp directory is NOT writable. [bash] chmod -R 777 app/tmp [/bash]
Your database configuration file is NOT present. Rename APP/Config/database.php.default to APP/Config/database.php 言われた通りにdatabase.php.defaultをdatabase.phpにする。 [bash] cp app/Config/database.php.default app/Config/database.php [/bash] ファイルの中のDATABASE_CONFIGクラスの$defaultに利用するデータベースの情報を入れる。
エラーはすっきり消えて、セットアップ完了となる(はずです)。 もし、まだ何かエラー出ていたら調べましょう。
ページをつくってみる
アプリケーションのホームになる画面をつくります。 http://tnnsst35.me/cakephp/home/ このURLでアクセスできるようにしてみます。
何をどう書き始めたらよいかわからない人でも心配はいりません。 CakePHPにはbakeというコードのひな形を生成してくれるプログラムがついているので、bakeを使うと便利です。 [bash] cd cakephp/app Console/cake bake
Welcome to CakePHP v2.0.4 Console
App : app
Path: /home/test/cakephp
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)
C
Bake Controller
Path: /home/test/cakephp/app/Controller/
Use Database Config: (default/test) [default] > Possible Controllers based on your current database: 1. Posts 2. Stickers 3. UserStickers 4. Users Enter a number from the list above, type in the name of another controller, or 'q' to exit
[q] > Home
Baking HomeController
Would you like to build your controller interactively? (y/n) [y] > Would you like to use dynamic scaffolding? (y/n) [n] > Would you like to create some basic class methods (index(), add(), view(), edit())? (y/n) [n] > Would you like to create the basic class methods for admin routing? (y/n) [n] > Would you like this controller to use other helpers besides HtmlHelper and FormHelper? (y/n) [n] > Would you like this controller to use any components? (y/n) [n] > Would you like to use Session flash messages? (y/n) [y] >
The following controller will be created:
Controller Name:
Home
Look okay? (y/n) [y] >
Baking controller class for Home...
Creating file /home/test/cakephp/app/Controller/HomeController.php
Wrote /home/test/cakephp/app/Controller/HomeController.php
Bake is detecting possible fixtures...
Baking test case for Home Controller ... [/bash] これで app/Controller/HomeController.php が出来上がっています。
ただコレだけでは動かないので、HomeControllerにindexメソッドを追加してやります。 [php] <?php App::uses('AppController', 'Controller'); /* * Home Controller * * @property Home $Home / class HomeController extends AppController {
public function index() { }
} [/php] これでひとまずControllerはできたので次はViewを作ります。
もちろんbakeを使います。 [bash] Console/cake bake
Welcome to CakePHP v2.0.4 Console
App : app
Path: /home/test/cakephp/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)
V
Bake View
Path: /home/test/cakephp/app/View/
Use Database Config: (default/test) [default] > Possible Controllers based on your current database: 1. Posts 2. Stickers 3. UserStickers 4. Users Enter a number from the list above, type in the name of another controller, or 'q' to exit [q] > Home Would you like bake to build your views interactively? Warning: Choosing no will overwrite Home views if it exist. (y/n) [n] > y Would you like to create some CRUD views (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] > n Would you like to create the views for admin routing? (y/n) [n] > Action Name? (use lowercase_underscored function name) index
The following view will be created:
Controller Name: Home Action Name: index
Path: /home/test/cakephp/app/View/Home/index.ctp
Look okay? (y/n) [y] >
Baking index
view file...
Creating file /home/test/cakephp/app/View/Home/index.ctp
Wrote /home/test/cakephp/app/View/Home/index.ctp
[/bash]
View/Home/index.ctp が焼き上がりました。
と言っても中身は空なので、確認用に何か入れておきます。
[html]
Homeだお
[/html] ここまで終わったらブラウザからhttp://tnnsst35.me/cakephp/home/を確認してみます。 きっと「Homeだお」という文字が表示されていると思います。
ルートを変更する
アプリケーションのホームができましたね。 ただ、ホームというからには / でも /home と同じ内容を表示したいですよね。 なので / でアクセスされたときの制御を変更します。 ルーティングの設定は app/Config/routes.php の中にあります。 28行目を変更します。 [php] // Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home')); Router::connect('/', array('controller' => 'Home', 'action' => 'index', 'home')); [/php] http://tnnsst35.me/cakephp/ にブラウザからアクセスしてみます。 http://tnnsst35.me/cakephp/home と同じ内容が表示されるようになりました。
とりあえずこれでCakePHPを使い始めることはできるようになりました。 あとは好きにアプリケーションを作っていきましょう。
まとめ
・CakePHPのインストールと設定は簡単 ・コードのひな形はbakeを使うのがオススメ ・ケーキを食べたくなる
今回やったようにCakePHPは「サーバの設定」などが特に必要なく簡単に導入できるという利点があります。
学習コストも低めだと思います。 僕自身、初めて触ったフレームワークはCakePHPでしたが、「MVC」という単語を知らなくても簡単にMVCが理解できて、コードを書くのも簡単なので初心者にはオススメのフレームワークです。 完全初心者の頃にsymfonyをやって難しすぎて気が狂いそうになった思い出があります。
巷でも「はやい」と噂のCodeigniterやFuelPHPに比べれば遅いという欠点もありますが、それなりに大規模プロジェクトでも使えると思っています。 機能がいろいろ詰め込まれているsymfonyに比べれば役不足かもしれませんが、その分無駄なものは少ないので学習コスト低めでシンプルに扱えます。 Pluginを公開してる人も結構います。
あとはアイコンがケーキなので甘党の人にもオススメです。 ケーキが食べたくなります。
おまけ
CakePHP関連のTipsといえば、元CakePHP開発者の人が立ち上げたLithiumがあったりします。 LithiumもMVCフレームワークで、以前少し試したことがあります。 PHP5.3で登場した「名前空間」がバリバリ使われていて、\hoge\foo\bar(); みたいな記述が山のようにあります。 個人的には「ちょっと見づらいな」と思ってしまって、そっと「:q!」を打ってしまいました。 ※まぁこれは名前空間の恩恵をまだわかっていないから思うだけかもしれませんが。