20091030cakephphandson 01

63
CakeMatsuriワークショップ 1 2009/10/30 yandod 快適アプリケーション開発入門

Transcript of 20091030cakephphandson 01

Page 1: 20091030cakephphandson 01

CakeMatsuriワークショップ

1

2009/10/30 yandod

快適アプリケーション開発入門

Page 2: 20091030cakephphandson 01

2

アジェンダ

CakePHPとは

つぶやきサービスを作ろう

セットアップ

MVCの作成、データの表示

フォームの扱い、データの保存

レイアウトの適用‏

Page 3: 20091030cakephphandson 01

3

CakePHPとは

Page 4: 20091030cakephphandson 01

公式サイト

4

http://www.cakephp.org/

Page 5: 20091030cakephphandson 01

コンセプト

全てのレベルのPHPユーザが素早く安定したウェブアプリケーションを開発が行える事

Page 6: 20091030cakephphandson 01

つまり

初心者でも手軽に開発ができる親しみやすさ

上級者がとことん使いこんでいけるだけの拡張性

この2つを両立

Page 7: 20091030cakephphandson 01

具体的な特徴

面倒なインストール・設定作業はほぼ皆無

小さなプログラムだけで機能を実現できる

PHP4/PHP5に両対応

サーバやコマンドライン、ライブラリの知識は丌要

Ruby on Railsにとてもよく似たMVCモデル

ルールを知ってると何だか楽になる原則

7

Page 8: 20091030cakephphandson 01

2007年頃から日本国内でも爆発的に普及

8

着実にユーザ層が拡大中

Page 9: 20091030cakephphandson 01

東京でのCakePHP勉強会

9

30人 → 50人 → 70人 → 140人

Page 10: 20091030cakephphandson 01

各国でのイベントも活発

10

Page 11: 20091030cakephphandson 01

つぶやきサービスを作ろう

11

CakePHPで作るマイクログログ

Page 12: 20091030cakephphandson 01

今回作成するアプリケーション

12

http://labs.strk.jp/code-fight/blog/

Page 13: 20091030cakephphandson 01

題材選定の目的

仕様がシンプルで理解しやすい

データ表示、保存、AJAXなどの要素が揃っている

素材の提供を許可してくださったsotarokさんに感謝

13

Page 14: 20091030cakephphandson 01

通常は公式サイトからダウンロード

14

Page 15: 20091030cakephphandson 01

セットアップ

取得した圧縮ファイルを展開

展開したファイルをPHPが動作する場所へ配置

設定ファイルを修正

コマンドライン作業などは必要なし

15

Page 16: 20091030cakephphandson 01

CakePHPのディレクトリ構造

16

フレームワーク本体

設定ファイル

コントローラー(よく使う)

モデル(よく使う)

ビュー(よく使う)

Page 17: 20091030cakephphandson 01

注意

セットアップ時に変更する設定が環境によっ

て異なる場合があります

Page 18: 20091030cakephphandson 01

index.phpへアクセス

18

上の通りのオールグリーンの表示があればOK

Page 19: 20091030cakephphandson 01

なんかおかしい例

19

mod_rewriteが動いていないとこうなる

Page 20: 20091030cakephphandson 01

対処方法(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

Page 21: 20091030cakephphandson 01

データベース設定

余計な問題を避ける為に極力 UTF8を使う。

phpMyAdminの設定ミスなどが原因で文字化けが起こりがち

テーブル名やカラム名はCakePHPのルールに従うと楽ができます。

好きな名前を使っても、追加の設定を行えば対応できます。

21

Page 22: 20091030cakephphandson 01

サンプルデータの登録

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'),

Page 23: 20091030cakephphandson 01

設定ファイル (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 をコピーして作成

文字化け対策

Page 24: 20091030cakephphandson 01

実習 1-0

ワークショップ用のCakePHPをセットアップしてみましょう

http://groups.google.co.jp/group/cakematsuri-workshop

PHPが動く場所に設置

app/config/sql/dump.sqlのデータを登録

database.php.defaultをコピーしてパスワード設定

Page 25: 20091030cakephphandson 01

基本のコーディング作業

処理の入り口を担当するController

データベースとのやりとりやロジックを担当するModel

画面を表示するView

25

Page 26: 20091030cakephphandson 01

理屈はともかく・・・

26

MVCのパーツを順次作成するのが基本のサイクル

Page 27: 20091030cakephphandson 01

Modelの作成

27

<?php

class Post extends AppModel

{

var $name = 'Post';

}

app/model/post.php として作成

※Modelは標準では単数形の名前になります。

Page 28: 20091030cakephphandson 01

Controllerの作成

28

<?php

class PostsController extends AppController {

var $name = 'Posts';

var $scaffold;

}

app/controller/posts_controller.php として作成

$scaffoldによりこれだけで動く!

Page 29: 20091030cakephphandson 01

/posts/ の実行結果

29

登録・一覧・ソート・更新・削除が可能

Page 30: 20091030cakephphandson 01

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という名前でデータを渡す

Page 31: 20091030cakephphandson 01

Viewの作成

31

<h1>ほげったー</h1>

<?php echo date(‘Y-m-d’); ?>

app/views/posts/index.ctp として作成(UTF-8で保存する事を忘れずに)

/posts/index へアクセスされた場合に表示する画面を作成します

Page 32: 20091030cakephphandson 01

/posts/index の実行結果

32

作成したViewが表示される

Page 33: 20091030cakephphandson 01

(重要)CakePHPの基本ルール

/posts/update にアクセスされた場合

→ PostsControllerのupdate メソッドを実行し

views/posts/update.ctp を表示

/mypage/home にアクセスされた場合

→ MypageControllerのhome メソッドを実行し

views/mypage/home.ctp を表示

33

ルールを把握してスムーズな作業を!

Page 34: 20091030cakephphandson 01

実習 1-1 1-2

Model,Controller,Viewを作る

models/post.php controllers/posts_controller.php

Scaffoldの挙動を確認

Indexアクションと views/posts/index.ctp を作成

自作した画面の表示を確認

Page 35: 20091030cakephphandson 01

データベースから取得したデータを表示する

Modelの機能によりSQLは自動的に実行されて結果はハッシュとしてControllerで取得できる

ControllerからViewへデータをsetで渡す

Viewでは渡された変数をただ使うだけ

35

Page 36: 20091030cakephphandson 01

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>

Page 37: 20091030cakephphandson 01

/posts/index の実行結果

37

データベースから取得したデータが表示された!

Page 38: 20091030cakephphandson 01

実習 1-3

Modelのデータを表示する

views/posts/index.ctpを修正

新しい画面へのリンクの設置

Controllerから渡した変数のデータ構造に注意

よくわからない時はvar_dump

Page 39: 20091030cakephphandson 01

データベースにデータを登録する

データ登録用の画面を作成

Modelの機能により配列変数を渡すだけでデータを登録できる

Modelに渡すデータ構造を作ってくれるFormHelperをつかう

入力制限のチェックも可能

39

Page 40: 20091030cakephphandson 01

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 時の処理を追加

Page 41: 20091030cakephphandson 01

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でフォームを出力

Page 42: 20091030cakephphandson 01

validateの追加 post.php

42

<?php

class Post extends AppModel

{

var $name = 'Post';

var $validate = array(

'body' => array(

'rule' => array('maxLength', 140),

'allowEmpty' => false),

);

}

Page 43: 20091030cakephphandson 01

/posts/add の実行結果

43

入力検証付きの登録画面ができた

Page 44: 20091030cakephphandson 01

/posts/add の実行結果

44

正しい入力をすれば登録される

Page 45: 20091030cakephphandson 01

実習 1-4

データ登録機能を作る

views/posts/add.ctp と addアクションを作成

models/post.phpにvalidateの設定を追加

入力チェックの挙動とデータ登録を確認

Page 46: 20091030cakephphandson 01

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へ移動する

Page 47: 20091030cakephphandson 01

/posts/delete/{id} の実行結果

47

urlに付不したidのレコードが削除される。必要であればindexなどの画面にリンクを設置

Page 48: 20091030cakephphandson 01

できた!

Controllerにアクションを追加

アクション内でModelの処理を呼び出す

ViewでControllerから渡されたデータを表示

Helperなどを利用すると記述内容を削減できる

48

作業の流れが把握できましたか?

Page 49: 20091030cakephphandson 01

49

もうすこしカッコよくする

Page 50: 20091030cakephphandson 01

Paginate

データをページ毎に分けて表示する

Controllerの機能とHelperの機能を使って実現

基本的にはイディオムなので丸覚え、コピペで対処可

50

Page 51: 20091030cakephphandson 01

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メソッドを使う

ソートなどの設定

Page 52: 20091030cakephphandson 01

Viewの修正 index.ctp

52

</table>

<?php echo $paginator->prev() ?> &nbsp;

<?php echo $paginator->numbers() ?> &nbsp;

<?php echo $paginator->next() ?>

ページの末尾にPaginatorヘルパーを呼ぶ処理を追加

Page 53: 20091030cakephphandson 01

/posts/index の実行結果

53

自動でクエリを組立てPaginateを実現!

リンクの表示

クエリの自動組立

Page 54: 20091030cakephphandson 01

実習 1-5

Paginateの組み込み

controllers/posts_controller.phpに設定を追加

views/posts/index.ctp にpaginatorの記述追加

データがページ分けして表示できればOK

Page 55: 20091030cakephphandson 01

レイアウト変更

画面のヘッダー・フッター部分は layoutに存在

通常時はCake標準の default flash などが使われる

デザインを変更する場合は app/view/layouts/ 以下に default.ctp などを置く

Defalutなど以外を使う場合は layoutプロパティを設定する

55

Page 56: 20091030cakephphandson 01

レイアウトの変更例

56

class PostsController extends AppController {

function help() {

$this->layout = ‘custom’;

}

}

app/view/layouts/custom.ctp をヘッタ・フッタとして利用

Page 57: 20091030cakephphandson 01

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の処理結果が入っている

Page 58: 20091030cakephphandson 01

Copyright © YusukeAndo. 2009 - . All rights reserved.

実行結果

あとは自由にCSSなどを設定すればOK

Page 59: 20091030cakephphandson 01

Copyright © YusukeAndo. 2009 - . All rights reserved.

素材を適用

大幅にそれっぽくなった

Page 60: 20091030cakephphandson 01

実習 1-6

layoutの組み込み

views/layouts/default.ctpを素材に入れ替える

views/posts/index.ctpを素材に入れ替える

それっぽい表示を確認

Page 61: 20091030cakephphandson 01

まとめ

61

Page 62: 20091030cakephphandson 01

まとめ

CakePHPはとても簡単はMVCフレームワーク

さまざまな機能を活用することでコード量を大きく減らす事ができる

必要な情報はマニュアル・API・ネットからゲットする

‚Give back as much as you take‛

ブログに書く、誰かに教えてあげるなど自分が得た以上のものを誰かに不えてあげましょう

62

Page 63: 20091030cakephphandson 01

63

質疑応答

ご静聴ありがとうございました。