3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

93
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando) CakePHP2.1 3時間濃縮 3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando) by nipotan

description

PHPカンファレンス北海道でのワークショップの資料です。

Transcript of 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

Page 1: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

CakePHP2.13時間濃縮

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)by nipotan

Page 2: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

本日の主旨

8時間耐久を圧縮CakePHP2.1の基本

骨の髄に(強制的に)刻みこむ時間が許す範囲で応用技

Page 3: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

who am I

Page 4: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

?CakePHP2実践入門(仮)

技術評論社より今夏出版予定

Page 5: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

本日のメニューMVCの考え方

セットアップの肝コントローラーの使い方

モデルの使い方ビューの使い方応用技の紹介

Page 6: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

MVCの考え方by crabchick

Page 7: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

MVCだらけ

Page 8: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

CakePHPもMVC

Railsインスパイア系

Page 9: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

なぜMVC

複雑化するプログラム整理が必要分割の経験則

Model View Controller

Page 10: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

MVCに分割

巨大なプログラム

Page 11: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

MVCの役割

•Model  データや処理(データベース処理)

•View  見た目を担当(HTMLの出力)

•Controller  入力を受けてモデルとビューを呼ぶ(それ以外)

Page 12: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

CakePHPの前に

ふつうのPHPスクリプトで考えてみます

Page 13: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

<?php

$keyword = '';

if (isset($_POST['keyword'])) {

$keyword = $_POST['keyword'];

}

mysql_connect('localhost','user','password');

mysql_select_db('cakephp_sample');

mysql_query('set names utf8');

$sql = sprintf(

"SELECT id,name,description FROM friends WHERE name LIKE '%s'",

mysql_real_escape_string('%'.$keyword.'%')

);

$result = mysql_query($sql);

$data = array();

while ($row = mysql_fetch_assoc($result)) {

$data[] = $row;

}

?>

<html>

<head><title>テストページ</title></head>

<body>

<form action="list1.php" method="POST">

<input name="keyword"><input type="submit">

</form>

<ul>

<?php

foreach ($data as $row) {

echo '<li>';

echo $row['name'];

echo $row['description'];

echo '</li>';

}

?></ul>

</body></html>

Page 14: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

<?php

$keyword = '';

if (isset($_POST['keyword'])) {

$keyword = $_POST['keyword'];

}

mysql_connect('localhost','user','password');

mysql_select_db('cakephp_sample');

mysql_query('set names utf8');

$sql = sprintf(

"SELECT id,name,description FROM friends WHERE name LIKE '%s'",

mysql_real_escape_string('%'.$keyword.'%')

);

$result = mysql_query($sql);

$data = array();

while ($row = mysql_fetch_assoc($result)) {

$data[] = $row;

}

?>

<html>

<head><title>テストページ</title></head>

<body>

<form action="list1.php" method="POST">

<input name="keyword"><input type="submit">

</form>

<ul>

<?php

foreach ($data as $row) {

echo '<li>';

echo $row['name'];

echo $row['description'];

echo '</li>';

}

?></ul>

</body></html> Viewへ

Modelへ

Page 15: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

<?php

//index.php

$keyword = '';

if (isset($_POST['keyword'])) {

$keyword = $_POST['keyword'];

}

include ‘model.php’;

include ‘view.php’;

<?php

//model.php

mysql_connect('localhost','user','password');

mysql_select_db('cakephp_sample');

mysql_query('set names utf8');

$sql = sprintf(

"SELECT id,name,description FROM friends WHERE name LIKE '%s'",

mysql_real_escape_string('%'.$keyword.'%')

);

$result = mysql_query($sql);

$data = array();

while ($row = mysql_fetch_assoc($result)) {

$data[] = $row;

}

<!-- view.php -->

<html>

<head><title>テストページ</title></head>

<body>

<form action="list1.php" method="POST">

<input name="keyword"><input type="submit">

</form>

<ul>

<?php

foreach ($data as $row) {

echo '<li>';

echo $row['name'];

echo $row['description'];

echo '</li>';

}

?></ul>

</body></html>

Model

View

Controller

Page 16: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

別々にしただけ

Page 17: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

ひとつの方が楽?

Page 18: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

問題は量

Page 19: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

自然発生

進化の答えがMVC

Page 20: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

CakePHPのMVCController置き場(全ての起点)

Model置き場(データベース関連)

View置き場(HTML関連)

Page 21: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

CakePHP習得の為に

Controllerの知識Modelの知識Viewの知識

それぞれの理解を深める

Page 22: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

セットアップの肝

Page 23: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

ポイントpdo_mysqlmod_rewritePHP5.2以上

core.php / database.phpchmod -R 777 app/tmp

Page 24: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

phpinfo()

Page 25: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

mod_rewriteが無い

Page 26: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

mod_rewriteの有効化

わりと地雷(勉強会中)

Page 27: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

rewrite無しの場合/** * To configure CakePHP *not* to use mod_rewrite and to * use CakePHP pretty URLs, remove these .htaccess * files: * * /.htaccess * /app/.htaccess * /app/webroot/.htaccess * * And uncomment the App.baseUrl below: */ //Configure::write('App.baseUrl', env('SCRIPT_NAME'));

コメントを外す(rewriteが無理な時だけ)urlの末尾にindex.phpを付ける

Page 28: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

準備完了

Page 29: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

Controllerの使い方

Page 30: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

典型的なコントローラー<?php// app/Controller/TasksController.phpApp::uses('AppController', 'Controller');

class TasksController extends AppController { public function index() { $task_data = $this->Task->find(‘all’); $this->set(‘task_data’,$task_data); }}

Page 31: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

Controllerの必須テクディスパッチのルール$scaffold $uses$this->render()$this->set()

$this->redirect()$this->request

Page 32: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

ディスパッチ

アクセスされたURLに応じて適切なコントローラーを

呼び出す機構

Page 33: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

ページコントローラー

index.phpmenu.php

mypage.phpに直接URLからアクセス

(ふつうのPHP)

Page 34: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

フロントコントローラー

index.phpにまずアクセスして、

その中でそれぞれの処理に飛ばす

(CakePHPはこの方式)

Page 35: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

ディスパッチの例/tasks/index→TasksControllerのindex/Oden/umai→OdenControllerのumai/my_page→MyPageControllerのindex

Page 36: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

routes.phpなら

任意のマッピングも追加可能(最後にURLだけ変更とか)そのままでOKなら設定不要

Page 37: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

$scaffold

public $scaffold;とするだけで標準機能が動く

※動作確認などに便利

Page 38: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

$uses

コントローラーが使うモデルのリスト省略時はコントローラー名と同一

命名規則で苦しむのは横着するからです

class MyController extends AppController { public $uses = array(‘Task’,‘User’);

}

Page 39: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

$this->render()

任意のViewを呼び出す省略時はアクション名と同名を呼ぶ

同じViewを使いまわす事もできる!

$this->render(‘hoge’);

Page 40: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

$this->set()

任意のデータをViewへ渡すスカラー値も配列も渡せる

Viewで使いたいデータはset()!

$this->set(‘hoge’,‘this is data’);

Page 41: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

$this->redirect()

任意のページへリダイレクト$this->flash() や

$this->Session->setFlash()と組みわせてメッセージ表示

登録完了やエラー時によく使う

$this->redirect(‘oden/umai’);

Page 42: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

$this->request

フォームの入力内容などにアクセス可

$_POSTなどを使った者は校庭10周に処す

$this->request->data$this->request->pass$this->request->is()

Page 43: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

Modelの使い方

Page 44: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

典型的なモデル

<?php// app/Model/Task.phpApp::uses('AppModel', 'Model');

class Task extends AppModel { public $useTable = 'tasks';}

Page 45: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

Modelの必須テク$useTable

$primaryKeyfind()

save() saveField() updateAll() delete()

deleteAll()

Page 46: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

Modelの必須テク2

$validates$belongsTo

$hasOne / $hasMany$hasAndBelongsToMany

Page 47: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

Model手強い

Modelを制する者はCakeを制す

Page 48: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

$useTable

モデルが処理を行うテーブル名を指定省略時はモデル名の複数形になるfalseにするとテーブル無しモデル

ここもはまりやすい

public $useTable = ‘tablename’;

Page 49: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

$primaryKey

テーブルの主キーを設定省略時は’id’

既存のテーブルを使う場合に便利

public $primaryKey = ‘id’;

Page 50: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

$this->find(‘all’,$options);$this->find(‘first’,$options);$this->find(‘count’,$options);$this->find(‘list’,$options);

$this->find(‘threaded’,$options);$this->find(‘neighbors’,$options);

find()

オプション次第で自在にSQL文を実行(オプションが多い)

Page 51: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

array( 'conditions' => array('Model.field' => $thisValue), 'recursive' => 1, //int 'fields' => array('Model.field1', 'DISTINCT Model.field2'), 'order' => array('Model.created', 'Model.field3 DESC'), 'group' => array('Model.field'), 'limit' => n, 'page' => n, 'offset' => n, 'callbacks' => true)

find()のオプション

Page 52: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

find()のオプション

Page 53: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

array( 'conditions' => array('Model.field' => $thisValue), 'recursive' => 1, //int 'fields' => array('Model.field1', 'DISTINCT Model.field2'), 'order' => array('Model.created', 'Model.field3 DESC'), 'group' => array('Model.field'), 'limit' => n, 'page' => n, 'offset' => n, 'callbacks' => true)

find()のオプション

必要ない部分は適宜省略可能様々なfind()にこのオプションを使う

Page 54: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

find(‘all’) の結果$data = $this->Hoge->find(‘all’);

$data[0][‘Hoge’][‘name’]; // Hogeのname$data[0][‘Hoge’][‘twitter’]; // Hogeのtwitter

Page 55: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

// field > ‘a’ のような比較array( 'conditions' => array('Model.field >' => $thisValue),)

= 以外の比較

キー名にスペースを空けて演算子

// field like ‘%a%’ のような比較array( 'conditions' => array('Model.field like' => ‘%’.$thisValue.’%’),)

Page 56: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

// ANDarray( 'conditions' => array( 'Model.field <' => 100 'Model.field >' => 20 ),)

AND条件 OR条件

// ORarray( 'conditions' => array( ‘OR’ => array( 'Model.field' => 10, 'Model.type' => ‘A’, ) ),)

Page 57: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

find(‘first’) の結果$data = $this->Hoge->find(‘first’);

$data[‘Hoge’][‘name’]; // Hogeのname$data[‘Hoge’][‘twitter’]; // Hogeのtwitter

Page 58: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

find(‘count’) の結果$data = $this->Hoge->find(‘count’);

数値で帰ってくる

Page 59: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

find(‘list’) の結果$data = $this->Hoge->find(‘list’);

リストで帰ってくる

Page 60: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

find(‘threaded’)find(‘neighbors’)

Page 61: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

save()

渡されたデータを元にデータを保存INSERT/UPDATEに両対応主キーがあるかないかで分岐

Model->save($data,$validate = true);

Page 62: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

saveField()

単一のフィールドを更新しかしあまり使わない

(save()で同じ事ができる)

Model->id = $id;Model->saveField($name,$value);

Page 63: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

updateAll()

条件にマッチするデータを全て更新あまり使わない

(データが少なければ1件づつsave()でも問題ないので)

Model->updateAll($fields,$condition);

Page 64: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

delete() deleteAll()

DELETEを実行できる。しかし実際のシステムでDELETEは使わず削除フラグなどで操作する事が多い。

Model->delete($id,$cascade);Model->deleteAll($condition,$cascade);

Page 65: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

$validates

配列で設定したとおりに検査save前に実行される

public $validate = array( 'twitter' => array( 'rule' => 'notEmpty', 'message' => 'Twitter is very important' ), 'name' => array( 'rule' => 'notEmpty', ) );

Page 66: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

$validates

メッセージや複雑な条件も設定可能

Page 67: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

アソシエーション

$belongsTo$hasOne / $hasMany

$hasAndBelongsToMany

Page 68: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

$belongsTo

モデルが属する上位モデルを指定日記(たくさん) ー> ユーザー(1)

public $belongsTo = array( 'Shimokita' => array( 'foreignKey' => 'friendlist_id' ));

Page 69: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

$belongsTo

設定さえすれば自動で関連データを取得

Page 70: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

$hasMany

モデルが所有している下位モデルを指定ユーザー ー> 日記(たくさん)

public $hasMany = array( 'Item');

Page 71: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

$hasMany

複数件の関連データが取得される

Page 72: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

Viewの使い方

Page 73: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

Viewの必須テクLayoutの変更$this->request$this->element()$this->Html$this->Form

Page 74: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

Layout

Page 75: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

Layoutの変更

ビューはレイアウトの中に読み込まれる

標準はapp/View/Layout/default.ctp

Page 76: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

default.ctpの要所<body><div id="container">

<div id="header"><h1><?php echo $this->Html->link($cakeDescription, 'http://cakephp.org'); ?></h1></div>

<div id="content"><?php echo $this->Session->flash(); ?><?php echo $this->fetch('content'); ?>

</div><div id="footer">

<?php echo $this->Html->link($this->Html->image('cake.power.gif'),'http://www.cakephp.org/',array('target' => '_blank', 'escape' => false));?>

</div></div><?php echo $this->element('sql_dump'); ?></body>

Page 77: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

CSSなど<head> <?php echo $this->Html->charset(); ?> <title> <?php echo $cakeDescription ?>: <?php echo $title_for_layout; ?> </title> <?php echo $this->Html->meta('icon'); echo $this->Html->css('cake.generic'); echo $scripts_for_layout; ?></head>

Page 78: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

CSS、画像はwebroot

Page 79: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

$this->request

リクエストはビューでも取れる(引き回す必要無し)

echo $this->request->data[‘name’]

Page 80: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

$this->element

テンプレートから別のテンプレートを読み込む。

(変数はオプションで渡す)

echo $this->element(‘template’,$data);

Page 81: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

$this->Html

HTMLを生成するヘルパーURLを自動生成して便利(手動でタグは書かない)

$url = array( ‘controller’ => ‘hoge’, ‘action’ => ‘index’);echo $this->Html->link($title,$url);

Page 82: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

$this->Form

フォームを生成する初期値のフィルインや

エラーメッセージを自動化

echo $this->Form->create(‘ModelName’);echo $this->Form->input($fieldName);

Page 83: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

応用技の紹介

Page 84: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

CakePHPの応用技

MVCのバランスMVCの各部品を強化標準の強力な機能群MVCの各要素に対応

Page 85: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

ベストプラクティス

モデル層を厚くせよ

Page 86: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

MVC::BHC

ControllerModel

View

ComponentBehavior

Helper

Page 87: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

応用技に手を伸ばす時

コードが肥大化した時まずはHelper

次にComponent最後にBehavior

Page 88: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

Helper

HtmlFormCacheJs

PaginatorSessionRss

Page 89: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

Component

AclAuthCookie

RequestHandler

PaginationSecuritySession

Page 90: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

Behavior

TreeContainable

Page 91: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

まだある応用技

プラグインCoreクラスConsole

ユニットテスト

Page 92: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

今後の羅針盤

http://book.cakephp.org/2.0/en/http://book.cakephp.org/2.0/ja/

Page 93: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012

3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

吐き気に勝った!