Upload
ogi
View
469
Download
1
Embed Size (px)
Citation preview
CakePHPハンズオン
1
2009/03/07 yandod
ケイクで始める快適WEB開発
Thanks
会場を提供してくれたグリーさん
見守ってくれるサポーターさん達
会場までPCを持ってきてくださったみなさん
2
自己紹介
名前 安藤祐介 yandod
PHPについて喋ったり、書いたりしています
CakePHPエヴァンジェリスト
猫好き/ゴルフ好き/カレー好き/CakePHP好き
3
4
アジェンダ
CakePHPとは
チュートリアルをやってみよう
セットアップ
CakePHPの基本1 (Controller)
CakePHPの基本2 (Model View)
応用テクニック
CakePHPのさまざまな機能
5
CakePHPとは
公式サイト
6
http://www.cakephp.org/
コンセプト
全てのレベルのPHPユーザが素早く安定したウェブアプリケーションを開発が行える事
つまり
初心者でも手軽に開発ができる親しみやすさ
上級者がとことん使いこんでいけるだけの拡張性
この2つを両立
具体的な特徴
面倒なインストール・設定作業はほぼ皆無
小さなプログラムだけで機能を実現できる
PHP4/PHP5に両対応
サーバやコマンドライン、ライブラリの知識は丌要
Ruby on Railsにとてもよく似たMVCモデル
9
主な開発者
10
Larry E. MastersPhpNut
Garrett J. Woodworthgwoo
Nate Abele_nate_
20名弱のチームで2005年頃から開発中
CakePHPの歴史
2005/03 ‚Cake‛ が公開される
2005/07 phpnutが ‛CakePHP‛ を公開
2005/08 _nate_ がチームに加入
2005/09 gwooがチームに加入
2006/05 CakePHP1.0 1.1
2008/01 CakePHP1.2-beta
2009/12 CakePHP1.2.0
11
2007年頃から日本国内でも爆発的に普及
12
着実にユーザ層が拡大中
東京でのCakePHP勉強会
13
30人 → 50人 → 70人 → 140人
各国でのイベントも活発
14
ケイクはあなたを待ってます
15
感謝の気持ちも忘れずに
チュートリアルをやってみよう
16
定番のブログチュートリアルを1.2で
チュートリアルの流れ
ダウンロード・セットアップ
データベース・テーブル作成
設定ファイル編集
基本のコーディング作業
17
今回の元ネタ
18
http://book.cakephp.org/ja/complete/219
チュートリアルの目的
多くの人が仕様を理解しているブログが題材(一覧表示・投稿・編集・削除)
アプリケーション作成の流れの把握
細かい機能や拡張は後回しでOK!
19
ダウンロード
20
ダウンロード
21
ダウンロード
22
寄付はまたの機会に。
セットアップ
取得した圧縮ファイルを展開
展開したファイルをPHPが動作する場所へ
ディレクトリ構造を確認しておきましょう
23
CakePHPのディレクトリ構造
24
フレームワーク本体
設定ファイル
コントローラー(よく使う)
モデル(よく使う)
ビュー(よく使う)
index.phpへアクセス
25
上の通りの表示があればOK
なんかおかしい例
26
mod_rewriteが動いていないとこうなる
対処方法
27
#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
データベーステーブルの作成 (10.1.2)
28
CREATE TABLE posts (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(50),
body TEXT,
created DATETIME DEFAULT NULL,
modified DATETIME DEFAULT NULL
);
INSERT INTO posts (title,body,created)
VALUES ('タイトル', 'これは、記事の本文です。', NOW());
INSERT INTO posts (title,body,created)
VALUES ('またタイトル', 'そこに本文が続きます。', NOW());
INSERT INTO posts (title,body,created)
VALUES ('タイトルの逆襲', 'こりゃ本当に面白そう!うそ。', NOW());
データベース設定での注意
余計な問題を避ける為に極力 UTF8を使う。
テーブル名やカラム名はCakePHPのルールに従うと楽ができます。
好きな名前を使っても、追加の設定を行えば対応できます。
29
設定ファイル (database.php)の作成(10.1.3)
30
var $default = array(
'driver' => 'mysql',
'persistent' => 'false',
'host' => 'localhost',
'port' => '',
'login' => 'cakeBlog',
'password' => 'c4k3-rUl3Z',
'database' => 'cake_blog_tutorial',
'schema' => '',
'prefix' => '',
'encoding' => 'utf8'//日本語ではencodingを指定しましょう。
);
app/config/database.php.default をコピーして作成
追加の設定(あとちょっとだけ)
app/config/core.php の Seculity.saltを変更
app/tmp 以下のディレクトリを書き込み可能に(Linuxなどの場合)
Apacheのmod_rewriteが有効になっていない場合はApp.baseUrl の行のコメントを解除
31
基本のコーディング作業
処理の入り口を担当するController
データベースとのやりとりやロジックを担当するModel
画面を表示するView
32
MVCのパーツを順次作成するのが基本のサイクル
Modelの作成
33
<?php
class Post extends AppModel
{
var $name = 'Post';
}
?>
app/model/post.php として作成
※Modelは標準では単数形の名前になります。
Controllerの作成
34
<?php
class PostsController extends AppController {
var $name = 'Posts';
var $scaffold;
}
?>
app/controller/posts_controller.php として作成
$scaffoldによりこれだけで動く!
/posts/ の実行結果
35
登録・一覧・更新・削除が可能 (管理程度ならこれでOK)
Controllerへのアクションの追加
36
<?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の作成
37
<h1>ほげほげブログ</h1>
<?php echo date(‘Y-m-d’); ?>
app/views/posts/index.ctp として作成(UTF-8で保存する事を忘れずに)
/posts/index へアクセスされた場合に表示する画面を作成します
/posts/index の実行結果
38
(重要)CakePHPの基本ルール
/posts/update にアクセスされた場合
→ PostsControllerのupdate メソッドを実行し
views/posts/update.ctp を表示
/mypage/home にアクセスされた場合
→ MypageControllerのhome メソッドを実行し
views/mypage/home.ctp を表示
39
ルールを把握してスムーズな作業を!
Viewの作成2 (10.1.8)
40
<h1>ほげほげブログ</h1>
<table>
<tr><th>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 $html->link($post['Post']['title'],
"/posts/view/".$post['Post']['id']); ?></td>
<td><?php echo $post['Post']['created']; ?></td>
</tr>
<?php endforeach; ?>
</table>
Controllerでセットした名前の変数を表示する
/posts/index の実行結果
41
/posts/view/{id} へのリンク
PostsControllerにviewアクションはないのでリンク先はエラー画面
Controllerへのアクションの追加
42
<?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());
}
}
?>
/posts/view 時の処理を追加
Viewの追加 view.ctp
43
<h1><?php echo $post['Post']['title']?></h1>
<p><small>Created:
<?php echo $post['Post']['created']?>
</small></p>
<p><?php echo $post['Post']['body']?></p>
/posts/view 時の画面を追加
/posts/view の実行結果
44
表示機能が完成
Controllerへのアクションの追加(抜粋)
45
<?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
46
<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');
?>
/posts/add 時の画面を追加FormHelperでフォームを出力
validateの追加 post.php
47
<?php
class Post extends AppModel
{
var $name = 'Post';
var $validate = array(
'title' => array('rule' => array('minLength', 1)),
'body' => array('rule' => array('minLength', 1))
);
}
?>
/posts/add の実行結果
48
入力検証付きの登録画面ができた
Controllerへのアクションの追加(抜粋)
49
<?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} の実行結果
50
urlに付不したidのレコードが削除される。必要であればindexなどの画面にリンクを設置
Controllerへのアクションの追加(抜粋)
51
class PostsController extends AppController {
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');
}
}
}
Viewの追加 edit.ctp
52
<h1>Edit Post</h1>
<?php
echo $form->create('Post',array(‘action’=>’edit’));
echo $form->hidden(‘id’);
echo $form->input('title');
echo $form->input('body', array('rows' => '3'));
echo $form->input('id', array('type'=>'hidden'));
echo $form->end('Save Post');
?>
/posts/edit 時の画面を追加ほとんどAddと同じだが、少しだけ違う
/posts/edit/{id} の実行結果
53
編集機能が動作する入力検証も登録時と同じように動作
できた!
Controllerにアクションを追加
アクション内でModelの処理を呼び出す
ViewでControllerから渡されたデータを表示
Helperなどを利用すると記述内容を削減できる
54
作業の流れが把握できましたか?
CakePHPのさまざまな機能達
55
まだまだ多くの機能がCakePHPには存在
いつでも使える機能デバッグ機能・コードシュガー
Controllerから利用する機能レイアウトの変更・任意のモデル利用・セッション
Modelから利用する機能データ取得方法・テーブル変更・リレーション
Viewから利用する機能ヘルパー・エレメント
56
57
いつでも使える機能
デバッグ機能
Core.php 内の設定により有効化
エラーの発生箇所・SQLの実行状況などが確認可能
58
コードシュガー
コーディングをちょっと楽にしてくれる裏ワザ
e h echo htmlspecialchars の代わりに利用可能
pr<pre>print_r()</pre>の代わりに利用可能
a aaarray(,,,,) array( ‘ ‘ => ‘’, ‘’ => ‘’)の意味
59
シュガーを使うと
60
array(‘action’ => ‘edit’, ‘method’ => ‘GET’))
煩雑なコードを大胆に短くできる
aa(‘action’,‘edit’,’method’,’GET’))
echo htmlspecialchars($hoge,ENT_QUOTES);
e(h($hoge));
61
Controllerで使える機能
レイアウト変更
画面のヘッダー・フッター部分は layoutに存在
通常時はCake標準の default flash などが使われる
デザインを変更する場合は app/view/layouts/ 以下に default.ctp などを置く
Defalutなど以外を使う場合は layoutプロパティを設定する
62
レイアウトの変更例
63
class PostsController extends AppController {
function help() {
$this->layout = ‘custom’;
}
}
app/view/layouts/custom.ctp をヘッタ・フッタとして利用
app/views/layouts/custom.ctp の内容
64
<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
任意のモデルの利用
Controllerが利用するModelは任意に変更可能
複数形などになじまない場合は任意で設定
大量に設定しすぎるのは考えもの
66
class PostsController extends AppController {
var $uses = array(‘Toukou’,’Tomodaci’);
}
Toukou.php Tomodaci.php をModelとして使用
セッション
Controllerの機能を拡張するComponentの機能を通じてセッションを利用する事ができる
標準設定では非常に短時間でデータが消える点に注意 (core.php のsefurity.levelで設定)
67
$this->Session->write(‘セッション名’,データ);
$this->Session->read(‘セッション名’);
複数の画面でデータを引き継ぐような場合に利用する
68
Modelで使える機能
69
対象テーブル・主キーの指定
モデル名を元に自動でテーブルを決定
例) モデル名:Book 対象テーブル:books
idという名称のカラムを主キーとして認識
上記のルール外のテーブル、主キーを指定したい場合はモデルのプロパティに設定を行う
対象テーブルにNULLを指定する事でDBを使用しないモデルとする事も可能
70
対象テーブル・主キーの指定例
class User extends AppModel {
var $name = ‘User';
var $useTable = ‘user_account’;
var $primaryKey = ‘login_id’;
}
暗黙的なルールに従うよりも把握しやすい場合も既存のテーブルでCakeを使う場合の必須TIPS
使用するテーブル名
主キーのカラム名
71
データ取得
配列化したパラメータを元に自動でクエリを実行し、データを取得する
取得対象カラム、ORDER LIMITなどが指定可能
自力で構築したWHERE句の指定も可能
全ての引数には初期値あり
find(‘all’,オプション)
データ取得
72
class PostsController extends AppController {
function hoge() {
$param = array(
'conditions' => aa(
'id >',1
),
'order' => 'title DESC'
);
$data = $this->Post->find('all',$param);
$this->set('posts',$data);
$this->render('index');
}}
パラメータの渡し方によってさまざまなクエリを実行する事が可能
実行例
73
→パラメータを元にWHERE句等を生成して実行
74
Viewで使える機能
ヘルパー
View中で共通で行うさまざまな処理をまとめたもの
標準でHtml Form のヘルパーが利用可能
その他のヘルパーを利用する際はControllerのhelpersプロパティに使いたいヘルパーを指定する
例えばRSSを出力したりもできるhttp://book.cakephp.org/ja/view/483/
75
ヘルパーの使用例
76
class PostsController extends AppController {
$helpers = array(‘Html’,’Form’,’Text’);
}
<style>
.highlight{
background-color:#FFFF00;
}
</style>
<p><?php echo $text->highlight($post['Post']['body'],"本文")?></p>
実行例
77
→CSSを利用して反転表示を実現
機能の利用方法の情報源
公式マニュアルhttp://book.cakephp.org/ja
APIドキュメントhttp://api.cakephp.org/
ユニットテストケースhttps://svn.cakephp.org/repo/trunk/cake/1.2.x.x/cake/tests/cases/libs/
各種書籍・ブログ
78
過去の勉強会資料・書籍
http://puyo2.upper.jp/cake/
「CakePHPのModelを使う」
「 CakePHPのHelperを使う」
「 CakePHP1.1 to 1.2」
書籍「CakePHPガイドブック」
79
より詳細な説明あり
チュートリアルを拡張してみる
80
チュートリアルを拡張してみよう
デザインの変更CSSの入れ替え
検索機能の追加Modelの機能の活用
RSS出力機能の追加View、Helperの利用
コメント投稿機能の追加MVCの追加
81
まとめ
82
まとめ
CakePHPはいつでも始められる
さまざまな機能を活用することでコード量を大きく減らす事ができる
必要な情報はマニュアル・API・ネットからゲットする
‚Give back as much as you take‛
ブログに書く、誰かに教えてあげるなど自分が得た以上のものを誰かに不えてあげましょう
83
84
質疑応答
ご静聴ありがとうございました。