84
CakePHPハンズオン 1 2009/03/07 yandod ケイクで始める快適WEB開発

20090307 CakePHPハンズオン

  • Upload
    ogi

  • View
    469

  • Download
    1

Embed Size (px)

Citation preview

Page 1: 20090307 CakePHPハンズオン

CakePHPハンズオン

1

2009/03/07 yandod

ケイクで始める快適WEB開発

Page 2: 20090307 CakePHPハンズオン

Thanks

会場を提供してくれたグリーさん

見守ってくれるサポーターさん達

会場までPCを持ってきてくださったみなさん

2

Page 3: 20090307 CakePHPハンズオン

自己紹介

名前 安藤祐介 yandod

PHPについて喋ったり、書いたりしています

CakePHPエヴァンジェリスト

猫好き/ゴルフ好き/カレー好き/CakePHP好き

3

Page 4: 20090307 CakePHPハンズオン

4

アジェンダ

CakePHPとは

チュートリアルをやってみよう

セットアップ

CakePHPの基本1 (Controller)

CakePHPの基本2 (Model View)‏

応用テクニック

CakePHPのさまざまな機能

Page 5: 20090307 CakePHPハンズオン

5

CakePHPとは

Page 6: 20090307 CakePHPハンズオン

公式サイト

6

http://www.cakephp.org/

Page 7: 20090307 CakePHPハンズオン

コンセプト

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

Page 8: 20090307 CakePHPハンズオン

つまり

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

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

この2つを両立

Page 9: 20090307 CakePHPハンズオン

具体的な特徴

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

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

PHP4/PHP5に両対応

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

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

9

Page 10: 20090307 CakePHPハンズオン

主な開発者

10

Larry E. MastersPhpNut

Garrett J. Woodworthgwoo

Nate Abele_nate_

20名弱のチームで2005年頃から開発中

Page 11: 20090307 CakePHPハンズオン

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

Page 12: 20090307 CakePHPハンズオン

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

12

着実にユーザ層が拡大中

Page 13: 20090307 CakePHPハンズオン

東京でのCakePHP勉強会

13

30人 → 50人 → 70人 → 140人

Page 14: 20090307 CakePHPハンズオン

各国でのイベントも活発

14

Page 15: 20090307 CakePHPハンズオン

ケイクはあなたを待ってます

15

感謝の気持ちも忘れずに

Page 16: 20090307 CakePHPハンズオン

チュートリアルをやってみよう

16

定番のブログチュートリアルを1.2で

Page 17: 20090307 CakePHPハンズオン

チュートリアルの流れ

ダウンロード・セットアップ

データベース・テーブル作成

設定ファイル編集

基本のコーディング作業

17

Page 18: 20090307 CakePHPハンズオン

今回の元ネタ

18

http://book.cakephp.org/ja/complete/219

Page 19: 20090307 CakePHPハンズオン

チュートリアルの目的

多くの人が仕様を理解しているブログが題材(一覧表示・投稿・編集・削除)

アプリケーション作成の流れの把握

細かい機能や拡張は後回しでOK!

19

Page 20: 20090307 CakePHPハンズオン

ダウンロード

20

Page 21: 20090307 CakePHPハンズオン

ダウンロード

21

Page 22: 20090307 CakePHPハンズオン

ダウンロード

22

寄付はまたの機会に。

Page 23: 20090307 CakePHPハンズオン

セットアップ

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

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

ディレクトリ構造を確認しておきましょう

23

Page 24: 20090307 CakePHPハンズオン

CakePHPのディレクトリ構造

24

フレームワーク本体

設定ファイル

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

モデル(よく使う)

ビュー(よく使う)

Page 25: 20090307 CakePHPハンズオン

index.phpへアクセス

25

上の通りの表示があればOK

Page 26: 20090307 CakePHPハンズオン

なんかおかしい例

26

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

Page 27: 20090307 CakePHPハンズオン

対処方法

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

Page 28: 20090307 CakePHPハンズオン

データベーステーブルの作成 ‏(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());

Page 29: 20090307 CakePHPハンズオン

データベース設定での注意

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

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

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

29

Page 30: 20090307 CakePHPハンズオン

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

Page 31: 20090307 CakePHPハンズオン

追加の設定(あとちょっとだけ)‏

app/config/core.php の Seculity.saltを変更

app/tmp 以下のディレクトリを書き込み可能に(Linuxなどの場合)‏

Apacheのmod_rewriteが有効になっていない場合はApp.baseUrl の行のコメントを解除

31

Page 32: 20090307 CakePHPハンズオン

基本のコーディング作業

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

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

画面を表示するView

32

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

Page 33: 20090307 CakePHPハンズオン

Modelの作成

33

<?php

class Post extends AppModel

{

var $name = 'Post';

}

?>

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

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

Page 34: 20090307 CakePHPハンズオン

Controllerの作成

34

<?php

class PostsController extends AppController {

var $name = 'Posts';

var $scaffold;

}

?>

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

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

Page 35: 20090307 CakePHPハンズオン

/posts/ の実行結果

35

登録・一覧・更新・削除が可能 (管理程度ならこれでOK)‏

Page 36: 20090307 CakePHPハンズオン

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

Page 37: 20090307 CakePHPハンズオン

Viewの作成

37

<h1>ほげほげブログ</h1>

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

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

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

Page 38: 20090307 CakePHPハンズオン

/posts/index の実行結果

38

Page 39: 20090307 CakePHPハンズオン

(重要)CakePHPの基本ルール

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

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

views/posts/update.ctp を表示

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

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

views/mypage/home.ctp を表示

39

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

Page 40: 20090307 CakePHPハンズオン

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でセットした名前の変数を表示する

Page 41: 20090307 CakePHPハンズオン

/posts/index の実行結果

41

/posts/view/{id} へのリンク

PostsControllerにviewアクションはないのでリンク先はエラー画面

Page 42: 20090307 CakePHPハンズオン

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

Page 43: 20090307 CakePHPハンズオン

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 時の画面を追加

Page 44: 20090307 CakePHPハンズオン

/posts/view の実行結果

44

表示機能が完成

Page 45: 20090307 CakePHPハンズオン

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

Page 46: 20090307 CakePHPハンズオン

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

Page 47: 20090307 CakePHPハンズオン

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))‏

);

}

?>

Page 48: 20090307 CakePHPハンズオン

/posts/add の実行結果

48

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

Page 49: 20090307 CakePHPハンズオン

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

Page 50: 20090307 CakePHPハンズオン

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

50

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

Page 51: 20090307 CakePHPハンズオン

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

}

}

}

Page 52: 20090307 CakePHPハンズオン

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と同じだが、少しだけ違う

Page 53: 20090307 CakePHPハンズオン

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

53

編集機能が動作する入力検証も登録時と同じように動作

Page 54: 20090307 CakePHPハンズオン

できた!

Controllerにアクションを追加

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

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

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

54

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

Page 55: 20090307 CakePHPハンズオン

CakePHPのさまざまな機能達

55

Page 56: 20090307 CakePHPハンズオン

まだまだ多くの機能がCakePHPには存在

いつでも使える機能デバッグ機能・コードシュガー

Controllerから利用する機能レイアウトの変更・任意のモデル利用・セッション

Modelから利用する機能データ取得方法・テーブル変更・リレーション

Viewから利用する機能ヘルパー・エレメント

56

Page 57: 20090307 CakePHPハンズオン

57

いつでも使える機能

Page 58: 20090307 CakePHPハンズオン

デバッグ機能

Core.php 内の設定により有効化

エラーの発生箇所・SQLの実行状況などが確認可能

58

Page 59: 20090307 CakePHPハンズオン

コードシュガー

コーディングをちょっと楽にしてくれる裏ワザ

e h echo htmlspecialchars の代わりに利用可能

pr<pre>print_r()</pre>の代わりに利用可能

a aaarray(,,,,) array( ‘ ‘ => ‘’, ‘’ => ‘’)の意味

59

Page 60: 20090307 CakePHPハンズオン

シュガーを使うと

60

array(‘action’ => ‘edit’, ‘method’ => ‘GET’))‏

煩雑なコードを大胆に短くできる

aa(‘action’,‘edit’,’method’,’GET’))‏

echo htmlspecialchars($hoge,ENT_QUOTES);

e(h($hoge));

Page 61: 20090307 CakePHPハンズオン

61

Controllerで使える機能

Page 62: 20090307 CakePHPハンズオン

レイアウト変更

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

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

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

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

62

Page 63: 20090307 CakePHPハンズオン

レイアウトの変更例

63

class PostsController extends AppController {

function help() {

$this->layout = ‘custom’;

}

}

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

Page 64: 20090307 CakePHPハンズオン

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

Page 65: 20090307 CakePHPハンズオン

Copyright © YusukeAndo. 2009 - . All rights reserved.

実行結果

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

Page 66: 20090307 CakePHPハンズオン

任意のモデルの利用

Controllerが利用するModelは任意に変更可能

複数形などになじまない場合は任意で設定

大量に設定しすぎるのは考えもの

66

class PostsController extends AppController {

var $uses = array(‘Toukou’,’Tomodaci’);

}

Toukou.php Tomodaci.php をModelとして使用

Page 67: 20090307 CakePHPハンズオン

セッション

Controllerの機能を拡張するComponentの機能を通じてセッションを利用する事ができる

標準設定では非常に短時間でデータが消える点に注意 (core.php のsefurity.levelで設定)‏

67

$this->Session->write(‘セッション名’,データ);

$this->Session->read(‘セッション名’);

複数の画面でデータを引き継ぐような場合に利用する

Page 68: 20090307 CakePHPハンズオン

68

Modelで使える機能

Page 69: 20090307 CakePHPハンズオン

69

対象テーブル・主キーの指定

モデル名を元に自動でテーブルを決定

例) モデル名:Book 対象テーブル:books

idという名称のカラムを主キーとして認識

上記のルール外のテーブル、主キーを指定したい場合はモデルのプロパティに設定を行う

対象テーブルにNULLを指定する事でDBを使用しないモデルとする事も可能

Page 70: 20090307 CakePHPハンズオン

70

対象テーブル・主キーの指定例

class User extends AppModel {

var $name = ‘User';

var $useTable = ‘user_account’;

var $primaryKey = ‘login_id’;

}

暗黙的なルールに従うよりも把握しやすい場合も既存のテーブルでCakeを使う場合の必須TIPS

使用するテーブル名

主キーのカラム名

Page 71: 20090307 CakePHPハンズオン

71

データ取得

配列化したパラメータを元に自動でクエリを実行し、データを取得する

取得対象カラム、ORDER LIMITなどが指定可能

自力で構築したWHERE句の指定も可能

全ての引数には初期値あり

find(‘all’,オプション)

Page 72: 20090307 CakePHPハンズオン

データ取得

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

}}

パラメータの渡し方によってさまざまなクエリを実行する事が可能

Page 73: 20090307 CakePHPハンズオン

実行例

73

→パラメータを元にWHERE句等を生成して実行

Page 74: 20090307 CakePHPハンズオン

74

Viewで使える機能

Page 75: 20090307 CakePHPハンズオン

ヘルパー

View中で共通で行うさまざまな処理をまとめたもの

標準でHtml Form のヘルパーが利用可能

その他のヘルパーを利用する際はControllerのhelpersプロパティに使いたいヘルパーを指定する

例えばRSSを出力したりもできるhttp://book.cakephp.org/ja/view/483/

75

Page 76: 20090307 CakePHPハンズオン

ヘルパーの使用例

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>

Page 77: 20090307 CakePHPハンズオン

実行例

77

→CSSを利用して反転表示を実現

Page 78: 20090307 CakePHPハンズオン

機能の利用方法の情報源

公式マニュアル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

Page 79: 20090307 CakePHPハンズオン

過去の勉強会資料・書籍

http://puyo2.upper.jp/cake/

「CakePHPのModelを使う」

「 CakePHPのHelperを使う」

「 CakePHP1.1 to 1.2」

書籍「CakePHPガイドブック」

79

より詳細な説明あり

Page 80: 20090307 CakePHPハンズオン

チュートリアルを拡張してみる

80

Page 81: 20090307 CakePHPハンズオン

チュートリアルを拡張してみよう

デザインの変更CSSの入れ替え

検索機能の追加Modelの機能の活用

RSS出力機能の追加View、Helperの利用

コメント投稿機能の追加MVCの追加

81

Page 82: 20090307 CakePHPハンズオン

まとめ

82

Page 83: 20090307 CakePHPハンズオン

まとめ

CakePHPはいつでも始められる

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

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

‚Give back as much as you take‛

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

83

Page 84: 20090307 CakePHPハンズオン

84

質疑応答

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