20090307 CakePHPハンズオン

Preview:

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

質疑応答

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