第4回ではCakePHPでの開発環境を構築しました。今回からアプリケーション部分の開発にとりかかります。
開発するのはToDo管理アプリケーションです。今回は以下の作業を行います。
- DBの設計と作成
- コントローラの作成
- モデルの作成
- ビューの作成
この作業で実装される機能は以下になります。
- タスク一覧の表示
このアプリケーション開発の前提として、
DBの設計と作成
まずはCakePHPに慣れるためのサンプルアプリケーションですので、
データベース名はtodo、
CREATE DATABASE todo; use todo; SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; CREATE TABLE `tasks` ( `id` int(11) unsigned NOT NULL auto_increment, `content` text NOT NULL, `status` enum('yet','done') NOT NULL default 'yet', `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMARY KEY (`id`), KEY `status` (`status`), KEY `created` (`created`), KEY `modified` (`modified`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ; INSERT INTO `tasks` (`id`, `content`, `status`, `created`, `modified`) VALUES (1, 'プログラマーズリファレンスガイドを一通り読む', 'done', '2007-08-20 00:00:00', '2007-08-21 01:00:00'), (2, 'ブログチュートリアルを行う', 'yet', '2007-08-21 02:00:00', '2007-08-21 02:00:00'), (3, 'CakePHP情報サイトをRSSリーダーに登録する', 'yet', '2007-08-21 05:00:00', '2007-08-21 05:00:00');
データベース名に合わせてapp/
リスト1 app/
<?php
class DATABASE_CONFIG {
var $default = array(
'driver' => 'mysql',
'connect' => 'mysql_connect',
'host' => 'localhost',
'login' => 'ここにDBのユーザー名',
'password' => 'ここにDBのパスワード',
'database' => 'todo',
'prefix' => '',
);
}
レンタルサーバなどでdb名が固定の場合は、
tasksテーブルの解説
テーブル名は複数形
CakePHPの規約ではテーブル名は複数形です。この規約は絶対ではありませんが、
複数形は単純に
複数形がない単語は例外的にそのままになります。たとえば
プライマリキーはid
プライマリキーはidです。CakePHPの規約ではプライマリキーのフィールド名はidなので、
タスク内容とステータス
タスク内容はcontentフィールドに入ります。タスクの状態は
作成日はcreated、更新日はmodified
タスクを作成した日はcreatedフィールドにdatetime型で入ります。更新日はmodifiedフィールドで、
コントローラの作成
コントローラ名は基本的に自由です。今回必要なのはタスク一覧を表示するコントローラーなので、
タスク一覧表示に必要なコードを含んだコントローラがリスト2になります。
リスト2 コントローラ
<?php // app/controllers/tasks_controller.php
class TasksController extends AppController {
var $name = 'Tasks'; var $uses = array('Task'); function index() { $this->set('tasks', $this->Task->findAll(null, null, 'Task.created ASC')); } }
1行ずつ解説します。
class定義
class TasksController extends AppController {
コントローラはPHPのクラスで、
var $name = 'Tasks';
「var $name」
使用するモデルの定義
var $uses = array('Task');
「var $uses」
ちなみにCakePHPでは$usesを書かなくてもコントローラ名の単数形のモデルを自動で読み込む機能があります。tasksコントローラではTaskモデルになるので、
複数のモデルを使用したいときは単純に配列として複数列挙します。たとえばTaskモデルとExampleモデルを使用したいときは、
var $uses = array('Task', 'Example');
となります。
アクションの定義
function index() {
$this->set('tasks', $this->Task->findAll(null, null, 'Task.created ASC'));
}
コントローラのアクションは、
URLからアクセスできないメソッドを作成したいときは、
アクションの内容
$this->set('tasks', $this->Task->findAll(null, null, 'Task.created ASC'));
この行ではtasksテーブルから作成日順にデータを取得し、
$this->set() はビューに値を渡すメソッドです。引数は (変数名, 値)です。
$this->Task->findAll()は、
ソート条件はMySQLのOrder句の要領で記述します。条件は
モデル作成前に実行してみる
コントローラが作成できたら、
モデル作成前では、
図1 モデル作成前の画面

画面の後半にモデルの作成場所と、
次にモデルの作成を行います。
モデルの作成
CakePHPではDBへのアクセスはモデルを通して行います。モデルの定義は app/
リスト3 app/
<?php
// app/model/task.php
class Task extends AppModel {
var $name = 'Task';
}
モデルの定義はPHPのクラスで、
モデルを作成したらもう一度/~gihyo/
今度はビューが見つからないときのエラー画面が表示されました
図2 ビュー作成前のエラー画面

次にビューの作成を行います。
ビューの作成
ビューは app/
tasksコントローラのindexアクション用のビューなので、
リスト4 app/
<table>
<tr>
<th>Id</th>
<th>タスク内容</th>
<th>状態</th>
<th>作成日</th>
</tr>
<?php foreach ($tasks as $task) { ?>
<tr>
<td><?php echo h($task['Task']['id']) ?></td>
<td><?php echo h($task['Task']['content']) ?></td>
<td><?php echo h($task['Task']['status']) ?></td>
<td><?php echo h($task['Task']['created']) ?></td>
</tr>
<?php } ?>
</table>
/~gihyo/
図3 コントローラ/

まずはお疲れ様でした。
最初は前提知識がないため戸惑う部分が多かったかと思います。フレームワークの習得速度は慣れればなれるほど上がっていくものですので、
次回予定はタスク作成の開発です。