20091030cakephphandson 01
TRANSCRIPT
CakeMatsuriワークショップ
1
2009/10/30 yandod
快適アプリケーション開発入門
2
アジェンダ
CakePHPとは
つぶやきサービスを作ろう
セットアップ
MVCの作成、データの表示
フォームの扱い、データの保存
レイアウトの適用
3
CakePHPとは
公式サイト
4
http://www.cakephp.org/
コンセプト
全てのレベルのPHPユーザが素早く安定したウェブアプリケーションを開発が行える事
つまり
初心者でも手軽に開発ができる親しみやすさ
上級者がとことん使いこんでいけるだけの拡張性
この2つを両立
具体的な特徴
面倒なインストール・設定作業はほぼ皆無
小さなプログラムだけで機能を実現できる
PHP4/PHP5に両対応
サーバやコマンドライン、ライブラリの知識は丌要
Ruby on Railsにとてもよく似たMVCモデル
ルールを知ってると何だか楽になる原則
7
2007年頃から日本国内でも爆発的に普及
8
着実にユーザ層が拡大中
東京でのCakePHP勉強会
9
30人 → 50人 → 70人 → 140人
各国でのイベントも活発
10
つぶやきサービスを作ろう
11
CakePHPで作るマイクログログ
今回作成するアプリケーション
12
http://labs.strk.jp/code-fight/blog/
題材選定の目的
仕様がシンプルで理解しやすい
データ表示、保存、AJAXなどの要素が揃っている
素材の提供を許可してくださったsotarokさんに感謝
13
通常は公式サイトからダウンロード
14
セットアップ
取得した圧縮ファイルを展開
展開したファイルをPHPが動作する場所へ配置
設定ファイルを修正
コマンドライン作業などは必要なし
15
CakePHPのディレクトリ構造
16
フレームワーク本体
設定ファイル
コントローラー(よく使う)
モデル(よく使う)
ビュー(よく使う)
注意
セットアップ時に変更する設定が環境によっ
て異なる場合があります
index.phpへアクセス
18
上の通りのオールグリーンの表示があればOK
なんかおかしい例
19
mod_rewriteが動いていないとこうなる
対処方法(mod_rewriteの設定)
20
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so
(推奨)httpd.conf を変更し、apache再起動
コメント解除
Apacheの設定が変更できない場合は core.php
//Configure::write('App.baseUrl', env('SCRIPT_NAME'));コメント解除
後者の場合は今後のURLに常にindex.phpを付ける事に/pages/home → index.php/pages/home
データベース設定
余計な問題を避ける為に極力 UTF8を使う。
phpMyAdminの設定ミスなどが原因で文字化けが起こりがち
テーブル名やカラム名はCakePHPのルールに従うと楽ができます。
好きな名前を使っても、追加の設定を行えば対応できます。
21
サンプルデータの登録
22
CREATE TABLE IF NOT EXISTS `posts` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`body` text COLLATE utf8_unicode_ci,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `posts` (`id`, `user_id`, `body`, `created`, `modified`) VALUES
(1, 1, 'これは、記事の本文です。', '2009-10-10 01:06:07', '2009-10-10 01:23:17'),
(2, 1, 'そこに本文が続きます。', '2009-10-10 01:06:07', '2009-10-10 01:23:58'),
(3, 1, 'こりゃ本当に面白そう!うそ。', '2009-10-10 01:06:07', '2009-10-10 01:24:08'),
設定ファイル (database.php)の作成
23
class DATABASE_CONFIG {
var $default = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'root',
'password' => '',
'database' => 'matsutter',
'encoding' => 'utf8',
'prefix' => '',
);
app/config/database.php.default をコピーして作成
文字化け対策
実習 1-0
ワークショップ用のCakePHPをセットアップしてみましょう
http://groups.google.co.jp/group/cakematsuri-workshop
PHPが動く場所に設置
app/config/sql/dump.sqlのデータを登録
database.php.defaultをコピーしてパスワード設定
基本のコーディング作業
処理の入り口を担当するController
データベースとのやりとりやロジックを担当するModel
画面を表示するView
25
理屈はともかく・・・
26
MVCのパーツを順次作成するのが基本のサイクル
Modelの作成
27
<?php
class Post extends AppModel
{
var $name = 'Post';
}
app/model/post.php として作成
※Modelは標準では単数形の名前になります。
Controllerの作成
28
<?php
class PostsController extends AppController {
var $name = 'Posts';
var $scaffold;
}
app/controller/posts_controller.php として作成
$scaffoldによりこれだけで動く!
/posts/ の実行結果
29
登録・一覧・ソート・更新・削除が可能
Controllerへのアクションの追加
30
<?php
class PostsController extends AppController {
var $name = 'Posts';
//var $scaffold; //丌要なので消す
function index() {
$this->set('posts', $this->Post->find('all'));
}
}
?>
Index メソッドを追加した事により、/posts/index へアクセスされた場合に実行する処理を定義できます
Viewに対してpostsという名前でデータを渡す
Viewの作成
31
<h1>ほげったー</h1>
<?php echo date(‘Y-m-d’); ?>
app/views/posts/index.ctp として作成(UTF-8で保存する事を忘れずに)
/posts/index へアクセスされた場合に表示する画面を作成します
/posts/index の実行結果
32
作成したViewが表示される
(重要)CakePHPの基本ルール
/posts/update にアクセスされた場合
→ PostsControllerのupdate メソッドを実行し
views/posts/update.ctp を表示
/mypage/home にアクセスされた場合
→ MypageControllerのhome メソッドを実行し
views/mypage/home.ctp を表示
33
ルールを把握してスムーズな作業を!
実習 1-1 1-2
Model,Controller,Viewを作る
models/post.php controllers/posts_controller.php
Scaffoldの挙動を確認
Indexアクションと views/posts/index.ctp を作成
自作した画面の表示を確認
データベースから取得したデータを表示する
Modelの機能によりSQLは自動的に実行されて結果はハッシュとしてControllerで取得できる
ControllerからViewへデータをsetで渡す
Viewでは渡された変数をただ使うだけ
35
ViewでControllerのデータを扱う
36
<?php echo $html->link('つぶやく','/posts/add') ?>
<table>
<tr><th>Id</th><th>user_id</th>
<th>Title</th><th>Created</th></tr>
<?php foreach ($posts as $post): ?>
<tr>
<td><?php echo $post['Post']['id']; ?></td>
<td><?php echo $post['Post']['user_id']; ?></td>
<td><?php echo $post['Post']['body']; ?></td>
<td><?php echo $post['Post']['created']; ?></td>
</tr>
<?php endforeach; ?>
</table>
/posts/index の実行結果
37
データベースから取得したデータが表示された!
実習 1-3
Modelのデータを表示する
views/posts/index.ctpを修正
新しい画面へのリンクの設置
Controllerから渡した変数のデータ構造に注意
よくわからない時はvar_dump
データベースにデータを登録する
データ登録用の画面を作成
Modelの機能により配列変数を渡すだけでデータを登録できる
Modelに渡すデータ構造を作ってくれるFormHelperをつかう
入力制限のチェックも可能
39
Controllerへのアクションの追加(抜粋)
40
<?php
class PostsController extends AppController {
function add() {
if (!empty($this->data)) {
if ($this->Post->save($this->data)) {
$this->flash('Your post has been saved.','/posts');
}
}
}
}
?>
/posts/add 時の処理を追加
Viewの追加 add.ctp
41
<h1>Add Post</h1>
<?php
echo $form->create('Post');
echo $form->input(‘user_id');
echo $form->input('body', array('rows' => '3'));
echo $form->end('Save Post');
?>
/posts/add 時の画面を追加FormHelperでフォームを出力
validateの追加 post.php
42
<?php
class Post extends AppModel
{
var $name = 'Post';
var $validate = array(
'body' => array(
'rule' => array('maxLength', 140),
'allowEmpty' => false),
);
}
/posts/add の実行結果
43
入力検証付きの登録画面ができた
/posts/add の実行結果
44
正しい入力をすれば登録される
実習 1-4
データ登録機能を作る
views/posts/add.ctp と addアクションを作成
models/post.phpにvalidateの設定を追加
入力チェックの挙動とデータ登録を確認
Controllerへのアクションの追加(抜粋)
46
<?php
class PostsController extends AppController {
function delete($id) {
$this->Post->del($id);
$this->flash('The post with id: '.$id.' has been deleted.', '/posts');
}
}
?>
/posts/delete 時の処理を追加
画面は存在しないのでViewは丌要
メッセージを表示後に /postsへ移動する
/posts/delete/{id} の実行結果
47
urlに付不したidのレコードが削除される。必要であればindexなどの画面にリンクを設置
できた!
Controllerにアクションを追加
アクション内でModelの処理を呼び出す
ViewでControllerから渡されたデータを表示
Helperなどを利用すると記述内容を削減できる
48
作業の流れが把握できましたか?
49
もうすこしカッコよくする
Paginate
データをページ毎に分けて表示する
Controllerの機能とHelperの機能を使って実現
基本的にはイディオムなので丸覚え、コピペで対処可
50
Controllerへの設定追加(抜粋)
51
<?php
class PostsController extends AppController {
var $name = 'Posts';
var $paginate = array(
'order' => array('Post.id' => 'DESC'),
'limit' => 10
);
function index() {
$this->set('posts', $this->paginate('Post'));
}
Modelのfindの代わりにControllerのPaginateを使う
Paginateメソッドを使う
ソートなどの設定
Viewの修正 index.ctp
52
</table>
<?php echo $paginator->prev() ?>
<?php echo $paginator->numbers() ?>
<?php echo $paginator->next() ?>
ページの末尾にPaginatorヘルパーを呼ぶ処理を追加
/posts/index の実行結果
53
自動でクエリを組立てPaginateを実現!
リンクの表示
クエリの自動組立
実習 1-5
Paginateの組み込み
controllers/posts_controller.phpに設定を追加
views/posts/index.ctp にpaginatorの記述追加
データがページ分けして表示できればOK
レイアウト変更
画面のヘッダー・フッター部分は layoutに存在
通常時はCake標準の default flash などが使われる
デザインを変更する場合は app/view/layouts/ 以下に default.ctp などを置く
Defalutなど以外を使う場合は layoutプロパティを設定する
55
レイアウトの変更例
56
class PostsController extends AppController {
function help() {
$this->layout = ‘custom’;
}
}
app/view/layouts/custom.ctp をヘッタ・フッタとして利用
app/views/layouts/custom.ctp の内容
57
<html>
<head>
<title><?php echo $title_for_layout; ?></title>
</head>
<?php echo $content_for_layout; ?>
</html>
$content_for_layout にviewの処理結果が入っている
Copyright © YusukeAndo. 2009 - . All rights reserved.
実行結果
あとは自由にCSSなどを設定すればOK
Copyright © YusukeAndo. 2009 - . All rights reserved.
素材を適用
大幅にそれっぽくなった
実習 1-6
layoutの組み込み
views/layouts/default.ctpを素材に入れ替える
views/posts/index.ctpを素材に入れ替える
それっぽい表示を確認
まとめ
61
まとめ
CakePHPはとても簡単はMVCフレームワーク
さまざまな機能を活用することでコード量を大きく減らす事ができる
必要な情報はマニュアル・API・ネットからゲットする
‚Give back as much as you take‛
ブログに書く、誰かに教えてあげるなど自分が得た以上のものを誰かに不えてあげましょう
62
63
質疑応答
ご静聴ありがとうございました。