Download - 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
![Page 1: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/1.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
CakePHP2.13時間濃縮
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)by nipotan
![Page 2: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/2.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
本日の主旨
8時間耐久を圧縮CakePHP2.1の基本
骨の髄に(強制的に)刻みこむ時間が許す範囲で応用技
![Page 3: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/3.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
who am I
![Page 4: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/4.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
?CakePHP2実践入門(仮)
技術評論社より今夏出版予定
![Page 5: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/5.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
本日のメニューMVCの考え方
セットアップの肝コントローラーの使い方
モデルの使い方ビューの使い方応用技の紹介
![Page 6: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/6.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
MVCの考え方by crabchick
![Page 7: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/7.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
MVCだらけ
![Page 8: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/8.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
CakePHPもMVC
Railsインスパイア系
![Page 9: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/9.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
なぜMVC
複雑化するプログラム整理が必要分割の経験則
Model View Controller
![Page 10: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/10.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
MVCに分割
巨大なプログラム
![Page 11: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/11.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
MVCの役割
•Model データや処理(データベース処理)
•View 見た目を担当(HTMLの出力)
•Controller 入力を受けてモデルとビューを呼ぶ(それ以外)
![Page 12: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/12.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
CakePHPの前に
ふつうのPHPスクリプトで考えてみます
![Page 13: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/13.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/14.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/15.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/16.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
別々にしただけ
![Page 17: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/17.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
ひとつの方が楽?
![Page 18: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/18.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
問題は量
![Page 19: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/19.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
自然発生
進化の答えがMVC
![Page 20: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/20.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
CakePHPのMVCController置き場(全ての起点)
Model置き場(データベース関連)
View置き場(HTML関連)
![Page 21: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/21.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
CakePHP習得の為に
Controllerの知識Modelの知識Viewの知識
それぞれの理解を深める
![Page 22: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/22.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
セットアップの肝
![Page 23: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/23.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/24.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
phpinfo()
![Page 25: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/25.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
mod_rewriteが無い
![Page 26: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/26.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
mod_rewriteの有効化
わりと地雷(勉強会中)
![Page 27: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/27.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/28.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
準備完了
![Page 29: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/29.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
Controllerの使い方
![Page 30: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/30.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/31.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/32.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
ディスパッチ
アクセスされたURLに応じて適切なコントローラーを
呼び出す機構
![Page 33: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/33.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
ページコントローラー
index.phpmenu.php
mypage.phpに直接URLからアクセス
(ふつうのPHP)
![Page 34: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/34.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
フロントコントローラー
index.phpにまずアクセスして、
その中でそれぞれの処理に飛ばす
(CakePHPはこの方式)
![Page 35: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/35.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/36.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
routes.phpなら
任意のマッピングも追加可能(最後にURLだけ変更とか)そのままでOKなら設定不要
![Page 37: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/37.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
$scaffold
public $scaffold;とするだけで標準機能が動く
※動作確認などに便利
![Page 38: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/38.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
$uses
コントローラーが使うモデルのリスト省略時はコントローラー名と同一
命名規則で苦しむのは横着するからです
class MyController extends AppController { public $uses = array(‘Task’,‘User’);
}
![Page 39: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/39.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
$this->render()
任意のViewを呼び出す省略時はアクション名と同名を呼ぶ
同じViewを使いまわす事もできる!
$this->render(‘hoge’);
![Page 40: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/40.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/41.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/42.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/43.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
Modelの使い方
![Page 44: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/44.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/45.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
Modelの必須テク$useTable
$primaryKeyfind()
save() saveField() updateAll() delete()
deleteAll()
![Page 46: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/46.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
Modelの必須テク2
$validates$belongsTo
$hasOne / $hasMany$hasAndBelongsToMany
![Page 47: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/47.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
Model手強い
Modelを制する者はCakeを制す
![Page 48: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/48.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
$useTable
モデルが処理を行うテーブル名を指定省略時はモデル名の複数形になるfalseにするとテーブル無しモデル
ここもはまりやすい
public $useTable = ‘tablename’;
![Page 49: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/49.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
$primaryKey
テーブルの主キーを設定省略時は’id’
既存のテーブルを使う場合に便利
public $primaryKey = ‘id’;
![Page 50: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/50.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/51.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/52.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
find()のオプション
![Page 53: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/53.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/54.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/55.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/56.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/57.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/58.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
find(‘count’) の結果$data = $this->Hoge->find(‘count’);
数値で帰ってくる
![Page 59: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/59.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
find(‘list’) の結果$data = $this->Hoge->find(‘list’);
リストで帰ってくる
![Page 60: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/60.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
find(‘threaded’)find(‘neighbors’)
![Page 61: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/61.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
save()
渡されたデータを元にデータを保存INSERT/UPDATEに両対応主キーがあるかないかで分岐
Model->save($data,$validate = true);
![Page 62: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/62.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
saveField()
単一のフィールドを更新しかしあまり使わない
(save()で同じ事ができる)
Model->id = $id;Model->saveField($name,$value);
![Page 63: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/63.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
updateAll()
条件にマッチするデータを全て更新あまり使わない
(データが少なければ1件づつsave()でも問題ないので)
Model->updateAll($fields,$condition);
![Page 64: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/64.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/65.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/66.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
$validates
メッセージや複雑な条件も設定可能
![Page 67: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/67.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
アソシエーション
$belongsTo$hasOne / $hasMany
$hasAndBelongsToMany
![Page 68: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/68.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
$belongsTo
モデルが属する上位モデルを指定日記(たくさん) ー> ユーザー(1)
public $belongsTo = array( 'Shimokita' => array( 'foreignKey' => 'friendlist_id' ));
![Page 69: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/69.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
$belongsTo
設定さえすれば自動で関連データを取得
![Page 70: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/70.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
$hasMany
モデルが所有している下位モデルを指定ユーザー ー> 日記(たくさん)
public $hasMany = array( 'Item');
![Page 71: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/71.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
$hasMany
複数件の関連データが取得される
![Page 72: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/72.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
Viewの使い方
![Page 73: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/73.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
Viewの必須テクLayoutの変更$this->request$this->element()$this->Html$this->Form
![Page 74: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/74.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
Layout
![Page 75: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/75.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
Layoutの変更
ビューはレイアウトの中に読み込まれる
標準はapp/View/Layout/default.ctp
![Page 76: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/76.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/77.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/78.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
CSS、画像はwebroot
![Page 79: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/79.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
$this->request
リクエストはビューでも取れる(引き回す必要無し)
echo $this->request->data[‘name’]
![Page 80: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/80.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
$this->element
テンプレートから別のテンプレートを読み込む。
(変数はオプションで渡す)
echo $this->element(‘template’,$data);
![Page 81: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/81.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/82.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/83.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
応用技の紹介
![Page 84: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/84.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
CakePHPの応用技
MVCのバランスMVCの各部品を強化標準の強力な機能群MVCの各要素に対応
![Page 85: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/85.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
ベストプラクティス
モデル層を厚くせよ
![Page 86: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/86.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
MVC::BHC
ControllerModel
View
ComponentBehavior
Helper
![Page 87: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/87.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
応用技に手を伸ばす時
コードが肥大化した時まずはHelper
次にComponent最後にBehavior
![Page 88: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/88.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
Helper
HtmlFormCacheJs
PaginatorSessionRss
![Page 89: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/89.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
Component
AclAuthCookie
RequestHandler
PaginationSecuritySession
![Page 90: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/90.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
Behavior
TreeContainable
![Page 91: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/91.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
まだある応用技
プラグインCoreクラスConsole
ユニットテスト
![Page 92: 3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/92.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022020116/556153e0d8b42adb6b8b5482/html5/thumbnails/93.jpg)
3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
吐き気に勝った!