いよいよ本格的にCakePHPに触れていきます。ここではマニュアルにある簡単なブログをつくることをでHelloWorldに替えます。
スポンサードリンク
その前にMVCモデルを理解しておきます。またCakePHPは命名規則があります。
MVCモデル
- データベース
- posts・・・テーブル名、複数形
- id
- title or name・・・自動制御?
- body
- created・・・自動制御
- modified or updated・・・自動制御
- 小文字で記載
- モデル
- データベースとの結びつきを定義
- Post
- /app/models/post.php
- バリデーションの定義
- コントローラ
- アクション(処理内容)を記述
- PostController
- /app/controllers/posts_controller.php
- バリデーション(値の検証)の呼び出し
- ビュー
- テンプレートファイル
- /app/views/posts/index.ctp
- 呼び出し
- www.hoge.com/contlollername/actionname/param1/param2
※ファイル名やテーブル名、カラム名などは命名規則に注意する(参考文献参照)
※それ以外にも以下のような注意がある(マニュアルより引用)
- Cake で使用するテーブル名は、英語の複数形にしてください。”users”、 “authors” 、 “articles” などです。注意:対応するモデルの名前は単数形になります。
- テーブルには、’id’ という名前の primary key がなければなりません。
- テーブル同士を関連付けるのであれば、外部キーは、 ‘article_id’ のようにしてください。テーブル名の単数形にアンダースコア(アンダーバー)を付け、最後に ‘id’ を付けます。
- テーブルに、’created’(作成) や ‘modified’(修正)という列があると、Cake はしかるべき時、フィールドにデータを自動的に書き込みます。
開発の流れ(例)
- テーブルの準備
- モデルの作成
- コントローラの作成(Index)
- ビューの作成(Index)
- コントローラの追加(Add)
- バリデーション(値の検証機能)の追加
- ビューの作成(Add)
- コントローラの追加(Del)
- ビューの編集(Index)
- コントローラの追加(Edit)
- ビューの作成(Edit)
- 必要に応じてルーティングの編集
※ルーティングを編集すると、/postsでアクセスしなければならないものを、/でのアクセスを/postsとみなすことができる
サンプルデータベースを準備
CREATE TABLE `posts` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(50) DEFAULT NULL,
`body` text,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=51 ;
サンプルデータの投入
INSERT INTO `posts` (`id`, `title`, `body`, `created`, `modified`) VALUES
(1, ‘タイトル’, ‘これは、記事の本文です。’, ‘2009-05-30 20:24:29’, NULL),
(2, ‘またタイトル’, ‘そこに本文が続きます。’, ‘2009-05-30 20:24:29’, NULL),
(3, ‘タイトルの逆襲’, ‘こりゃ本当に面白そう!うそ。’, ‘2009-05-30 20:24:29’, NULL);
app/models/post.php
<?php
class Post extends AppModel
{
var $name = ‘Post’;
var $validate = array(
‘title’ => array(
‘rule’ => array(‘minLength’, 1)
),
‘body’ => array(
‘rule’ => array(‘minLength’, 1)
)
);
}
?>
app/controllers/posts_controller.php
<?php
class PostsController extends AppController {
var $name = ‘Posts’;
function index() {
$this->set(‘posts’, $this->Post->find(‘all’));
}
function view($id = null) {
$this->Post->id = $id;
$this->set(‘post’, $this->Post->read());
}
function add() {
if (!empty($this->data)) {
if ($this->Post->save($this->data)) {
$this->flash(‘Your post has been saved.’,’/posts’);
}
}
}
function delete($id) {
$this->Post->del($id);
$this->flash(‘The post with id: ‘.$id.’ has been deleted.’, ‘/posts’);
}
function edit($id = null) {
$this->Post->id = $id;
if (empty($this->data)) {
$this->data = $this->Post->read();
} else {
if ($this->Post->save($this->data[‘Post’])) {
$this->flash(‘Your post has been updated.’,’/posts’);
}
}
}
}
?>
app/views/posts/index.ctp
<h1>Blog posts</h1>
<p><?php echo $html->link(“Add Post”, “/posts/add”); ?></p>
<table>
<tr>
<th>Id</th>
<th>Title</th>
<th>Created</th>
</tr>
<!– $post配列をループして、投稿記事の情報を表示 –>
<?php foreach ($posts as $post): ?>
<tr>
<td><?php echo $post[‘Post’][‘id’]; ?></td>
<td>
<?php echo $html->link($post[‘Post’][‘title’],’/posts/view/’.$post[‘Post’][‘id’]);?>
<?php echo $html->link(
‘Delete’,
“/posts/delete/{$post[‘Post’][‘id’]}”,
null,
‘Are you sure?’
)?>
<?php echo $html->link(‘Edit’, ‘/posts/edit/’.$post[‘Post’][‘id’]);?> </td>
<td><?php echo $post[‘Post’][‘created’]; ?></td>
</tr>
<?php endforeach; ?>
</table>
app/views/posts/add.ctp
<h1>Add Post</h1>
<?php
echo $form->create(‘Post’);
echo $form->input(‘title’);
echo $form->input(‘body’, array(‘rows’ => ‘3’));
echo $form->end(‘Save Post’);
?>
app/views/posts/edit.ctp
<h1>Edit Post</h1>
<?php
echo $form->create(‘Post’, array(‘action’ => ‘edit’));
echo $form->input(‘title’);
echo $form->input(‘body’, array(‘rows’ => ‘3’));
echo $form->input(‘id’, array(‘type’=>’hidden’));
echo $form->end(‘Save Post’);
?>
app/views/posts/view.ctp
<h1><?php echo $post[‘Post’][‘title’]?></h1>
<p><small>Created: <?php echo $post[‘Post’][‘created’]?></small></p>
<p><?php echo $post[‘Post’][‘body’]?></p>
参考文献(主に基本)
- マニュアル :: 1.2 Collection :: The Cookbook :
301 Moved Permanently - さくらで CakePHP | cafe chantant blog :
http://www.cafechantant.com/blog/?p=233&ct=1 - 本番環境のディレクトリ構成例 – cakephperの日記(cakePHP1.2ベース) :
本番環境のディレクトリ構成例 - cakephperの日記(CakePHP, Laravel, PHP)他の人のCakePHPのディレクトリ構成ってどうなってるのかなと思ったので、とりあえず自分の環境を公開。 本番環境では下記のようなディレクトリ構成をとってます。 /home/me/cake以下にCakePHPのコアライブラリや自作アプリを配... - cakePHPのメモ :
cakePHPのメモここではphpのフレームワークのcakePHPを紹介しています - joomla – CakePHPのサンプル :
http://kiyoeri.gotdns.org/joomla/content/view/46/2/ - CakePHPをさくらインターネットにインストール – Getting OUT :
CakePHPをさくらインターネットにインストール – GettingOUT
参考文献(主に命名規則)
- “CakePHPシステムデザイン(最新規約)” フォーラム – CakePHP Users in Japan :
CakePHP - Build fast, grow solid | PHPフレームワークCakePHP is an open-source web, rapid development framework that makes building web applications simpler, faster and requ... - CakePHP 規約ワードメーカー WordMaker for CakePHP Conventions :
302 Found - CakePHP Note:命名規則 :
http://www.garacter.com/notes/CakePHP+Note:%E5%91%BD%E5%90%8D%E8%A6%8F%E5%89%87/pi:196 - CakePHP 1.2 を設定してみる その2 ~命名規則の罠~ :
http://wp.n-brid.com/2008/12/15/120/
コメント