Your SlideShare is downloading. ×
20091030cakephphandson 02
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

20091030cakephphandson 02

1,238
views

Published on


0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,238
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. CakeMatsuriワークショップ Model&Helper活用講座 2009/10/30 yandod 1 1
  • 2. アジェンダ Modelの活用 データソース抽象化レイヤ機能 クエリ実行機能 アソシエーション Helperの活用 代表的なヘルパー ヘルパーの自作 AJAXヘルパーの利用 Copyright © YusukeAndo. 2009. All rights reserved. 2
  • 3. データソース抽象化
  • 4. データソースの抽象化 さまざまなデータベースを設定だけで利用可能 CakePHPは app/config/database.php 内の 設定により様々なデータベースを利用可能 Datasourceドライバを自作すればデータベース 以外からデータを取得するModelも作成可能 CSV Twitter Google API データベースへの接続もこの一種 複数のデータソースの併用も可能 Copyright © YusukeAndo. 2009. All rights reserved. 4
  • 5. データベース設定の記述例 app/config/database.php class DATABASE_CONFIG { ※利用するドライバ var $default = array('driver' => 'mysql', 'connect' => 'mysql_connect', 永続接続など 'host' => 'localhost', 'login' => 'dbuser', 接続先設定 'password' => 'hoge', 'database' => 'beefcurry', 'prefix' => ''); テーブル名の接頭語 var $test = array('driver' => 'mysql', 'connect' => 'mysql_connect',.... 複数の設定を記述可 } ※ PEARを利用する場合は pear-mysql のように記述 Copyright © YusukeAndo. 2009. All rights reserved. 5
  • 6. Modelが使用するデータソースの指定 app/models/memo.php (モデル毎に指定する場合) class Memo extends AppModel { var $name = 'Memo'; var $belongsTo = array('User'); 使用する設定の名称 var $useDbConfig = „test‟; } app/app_model.php (アプリ全体に適用する場合) class AppModel extends Model{ function __construct() { $this->useDbConfig = "test"; parent::__construct(); } } Copyright © YusukeAndo. 2009. All rights reserved. 6
  • 7. モデルの誤ったイメージ Hoge Fuga データベース Muga Copyright © YusukeAndo. 2009. All rights reserved. 7
  • 8. モデルの実際のイメージ Hoge データベース Fuga WEBAPI Muga どこにも接続しな いモデルも可 Copyright © YusukeAndo. 2009. All rights reserved. 8
  • 9. データソースの意味 CakePHPのModelはデータベースのテーブルに 通信するとは限らない データベース以外との通信を行う事や組み合わ せなども自在 複数のデータベースを併用するような事や、テー ブルと異なる単位のModelの作成などは朝飯前 →主要なデータベースをカバーし、PEAR、ADOdb等も利用可能 Copyright © YusukeAndo. 2009. All rights reserved. 9
  • 10. クエリ実行機能
  • 11. CakePHPが提供するクエリ実行機能 Modelを通じて下記の処理が可能 • 対象テーブル・主キーの指定 • データ構造を元にした更新クエリの自動実行 • 条件を元にした検索クエリの自動実行 • 任意のSQLの実行 CakePHPの代表的な機能 Copyright © YusukeAndo. 2009. All rights reserved. 11
  • 12. 対象テーブル・主キーの指定 モデル名を元に自動でテーブルを決定 例) モデル名:Book 対象テーブル:books idという名称のカラムを主キーとして認識 上記のルール外のテーブル、主キーを指定した い場合はモデルのプロパティに設定を行う 対象テーブルにNULLを指定する事でDBを使用 しないモデルとする事も可能 Copyright © YusukeAndo. 2009. All rights reserved. 12
  • 13. 対象テーブル・主キーの指定例 app/models/user.php class User extends AppModel { var $name = „User'; 使用するテーブル名 var $useTable = „user_account‟; var $primaryKey = „login_id‟; 主キーのカラム名 } 命名規則は必須ではなくあくまで「デフォルト」 Copyright © YusukeAndo. 2009. All rights reserved. 13
  • 14. 登録・更新クエリの自動実行 パラメータを元に自動でクエリを実行 主キーを指定し、該当レコードが存在すれば UPDATE 主キーを指定しない場合は常にINSERT 単一カラムの更新であれば直接指定も可能 データ型式はモデル名とカラム名をキーにしたハ ッシュを利用する(フォームと同じ) SQLを整形する退屈なプログラムを 書くのを止めよう Copyright © YusukeAndo. 2009. All rights reserved. 14
  • 15. Controllerへのアクションの修正‫‏‬ <?php class PostsController extends AppController { function add() { if (!empty($this->data)) { $this->data[‘Post’][‘user_id’] = 1; //明示的にデータを指定 if ($this->Post->save($this->data)) { $this->flash('Your post has been saved.','/posts'); } } } } フォームからのデータでも通常のデータでも保存可能 15
  • 16. 自動で行われる挙動が問題になった時 自動で新規登録・更新が変わってしまうのが困 る場合はidにnullをセットすれば必ず新規登録 フォームを汚染されて更新してはいけないカラム が更新される事を防ぐにはオプションを指定 複数のレコードを新規登録する時はcreateを呼 ぶか、idにnullをセットしなおす ちょっとした工夫で挙動を制限できます Copyright © YusukeAndo. 2009. All rights reserved. 16
  • 17. 実習 2-1 つぶやき登録の修正 controllers/posts_controller.php を修正 user_idを自由入力させないようにする Copyright © YusukeAndo. 2009. All rights reserved. 17
  • 18. 検索クエリの自動実行 配列化したパラメータを元にクエリを実行 取得対象カラム、ORDER LIMITなどが指定可能 自力で構築したWHERE句の指定も可能 マジックメソッドでの検索も可能 findBy{カラム名} 全ての引数には初期値あり function find($type, $params) Copyright © YusukeAndo. 2009. All rights reserved. 18
  • 19. findのタイプ all 全件取得 first 最初の1件を取得 count 件数を取得 list リスト構造のデータを取得 threaded スレッド型式のデータを取得 neighbors 隣り合うデータを取得 圧倒的にallの使用頻度が高い! Copyright © YusukeAndo. 2009. All rights reserved. 19
  • 20. findのパラメータ conditions 各カラムへの条件を指定 recursive 関連データの取得の有無 fields 取得するフィールド order 並び替え指定 group グルーピング指定 limit データ取得件数 page ページ番号 callbacks コールバックを実行するか Copyright © YusukeAndo. 2009. All rights reserved. 20
  • 21. 検索クエリの自動実行 function hoge() { $params = array( 'conditions' => array( ‘Post.user_id’ => ‘1’, //user_id = 1 ‘Post.created >=’ => ‘2009-10-10‘ //演算子 ) ); $posts = $this->Post->find('all',$params); } Copyright © YusukeAndo. 2009. All rights reserved. 21
  • 22. 検索クエリの自動実行 SQLデバッグ表示で確認 = の比較 >= の比較 →パラメータを元にWHERE句を生成して実行 Copyright © YusukeAndo. 2009. All rights reserved. 22
  • 23. 検索時の注意点 比較演算子の指定方法はどうすれば? • カラム名の後に演算子を置く • 省略時は = として比較する句を生成 • 値が配列の場合は IN (n,n,n) に展開 →演算子をインジェクションされないように注意。 Copyright © YusukeAndo. 2009. All rights reserved. 23
  • 24. 検索クエリの自動実行 (OR検索) function hoge() { $params = array( 'conditions' => array( ‘OR’ => array( ‘Post.user_id’ => ‘1’, //user_id = 1 ‘Post.created >=’ => ‘2009-10-10‘ ) ) ); $posts = $this->Post->find('all',$params); } Copyright © YusukeAndo. 2009. All rights reserved. 24
  • 25. 検索クエリの自動実行(OR検索) SQLデバッグ表示で確認 →OR ANDなどを配列の階層で表現可能 Copyright © YusukeAndo. 2009. All rights reserved. 25
  • 26. 任意のSQLの実行 function hoge(){ $sql = “SELECT * FROM memos as Memo”; $data = $this->Memo->query($sql); } 一連のfindの挙動とはほぼ無関係 • 自由にSQLを記述 • データを取得する際は as を指定するとベター • 結果は配列で取得 Copyright © YusukeAndo. 2009. All rights reserved. 26
  • 27. クエリの直接実行 SQLデバッグ表示で確認 Copyright © YusukeAndo. 2009. All rights reserved. 27
  • 28. find count の実行例 function index(){ $post_data = $this->paginate('Post'); $param = array( 'conditions' => aa('Post.user_id',1), ); $my_count = $this->Post->find('count',$param); $all_count = $this->Post->find('count'); $this->set('my_count',$my_count); $this->set('all_count',$all_count); $this->set('post_data',$post_data); $this->render('index'); } Copyright © YusukeAndo. 2009. All rights reserved. 28
  • 29. 実習 2-2 つぶやき表示の修正 controllers/posts_controller.php を修正 あなたのつぶやき、みんなのつぶやきの件数を取得 find count を使う 件数をViewにSet Layout内の数値を変数に置き換える Copyright © YusukeAndo. 2009. All rights reserved. 29
  • 30. バリデーション
  • 31. validation機能 validation機能の概要 • Model内に各カラムの制限値を配列で設定 • save()メソッド実行時に自動で検査し通過時のみデータを 登録する。 • validatesメソッドで任意に実行も可能。 • 独自の検証ロジックが必要な際はModelのvalidatesをオー バーライドして実装する。 →scaffoldではこれらの機能がフル活用されている。 Copyright © YusukeAndo. 2009. All rights reserved. 31
  • 32. アソシエーション
  • 33. アソシエーション機能 Model内で従属関係を指定する。 belongsTo hasMany hasOne hasAndBelongsToMany などを指定可能 外部キーが命名規則に当てはまらない場合はキー 名も併せて指定する 上記の設定がなされていればfindなどの際に従属 テーブルをJOINするSQLが実行される。 findなどのrecursive引数により関連レコードの取得 深度を設定可 →基本的にModelに対して設定をするだけでOK Copyright © YusukeAndo. 2009. All rights reserved. 33
  • 34. アソシエーションの種類 belongsTo 一件のデータに従属する 日記→作成者 hasMany 複数のデータを所有する 作成者→日記 hasOne 一件のデータを所有する ユーザ→プロフィール hasAndBelongsToMany データ間を関連付ける中間テーブルなど ブログ ← 関連付け → タグ →基本的にModelに対して設定をするだけでOK Copyright © YusukeAndo. 2009. All rights reserved. 34
  • 35. アソシエーション設定の例 class Post extends AppModel { リレーション簡 //var $belongsTo = array('User'); 易設定 var $belongsTo = array('User' => array('className' => 'User', 'conditions' => '', 'order' => '', 'foreignKey' => 'user_id' )); } リレーション設定 (冗長な記述) Copyright © YusukeAndo. 2009. All rights reserved. 35
  • 36. 自動的に関連データを取得 Copyright © YusukeAndo. 2009. All rights reserved. 36
  • 37. 関連データの内容を表示 Copyright © YusukeAndo. 2009. All rights reserved. 37
  • 38. 実習 2-3 関連付けの設定 Models/post/php に設定を追加 views/posts/index.ctpを修正 それっぽい表示を確認 Copyright © YusukeAndo. 2009. All rights reserved. 38
  • 39. まとめ Modelの機能を活用する事でDB処理を大幅にカット可能 汎用性に配慮した実装になっている 状況次第で従来どおりのクエリ処理を記述してもOK アソシエーションなどの設定はツールを活用した方が良い 実感としてはかなり楽です。(クエリの整形とか) 利用のインターフェースが複数用意されているので、違和 感のない利用方法が見つけられると思います。 Copyright © YusukeAndo. 2009. All rights reserved. 39
  • 40. 代表的なヘルパー
  • 41. 代表的なヘルパー HtmlHelper FormHelper JavaScriptHelper PaginatorHelper RssHelper →基本的にModelに対して設定をするだけでOK Copyright © YusukeAndo. 2009. All rights reserved. 41
  • 42. ヘルパーの自作
  • 43. ヘルパーを自作する時 独自のルールでURLを作成する ex) ユーザーIDを元にユーザーページへリンクする さまざまな条件に従って画像を表示する ex) 数値に応じて表示するアイコンを3段階に変更 文字列やデータを独自のフォーマットで変形したい ex) dateなどで対応できないようなフォーマット Viewをifや処理で汚さない為の手段 →基本的にModelに対して設定をするだけでOK Copyright © YusukeAndo. 2009. All rights reserved. 43
  • 44. ヘルパーを自作する手順 app/views/helpers にクラスを作成 Controller内のhelpersに指定 自作したHelper内で別のHelperも呼び出せる 例としてgravatarの呼出などがhelperに適している Gravatarはメールアドレスをmd5する事でアイコ ン画像を呼び出せるサービス Copyright © YusukeAndo. 2009. All rights reserved. 44
  • 45. Gravatarを表示するヘルパー <?php class GravatarHelper extends AppHelper { var $helpers = array('Html'); function image($mail){ return $this->Html->image( 'http://www.gravatar.com/avatar/'. md5($mail). '?s=40&r=G'); } } Copyright © YusukeAndo. 2009. All rights reserved. 45
  • 46. 自作したヘルパーを設定 <?php class PostsController extends AppController { var $name = 'Posts'; var $helpers = array('Gravatar'); //var $scaffold; var $paginate = array( 'order' => array('Post.id' => 'DESC'), 'limit' => 10 ); } Copyright © YusukeAndo. 2009. All rights reserved. 46
  • 47. 自作のGravatarヘルパーを組み込んだ例 <?php foreach ($post_data as $row): ?> <tr> <td class="friendicon"> <?php //echo $html- >image('http://www.gravatar.com/avatar/'.md5($row['U ser']['mail']).'?s=40&r=G') ?> <?php echo $gravatar->image($row['User']['mail']) ?> </td> </tr> <?php endforeach; ?> ヘルパー化によってシンプルに Copyright © YusukeAndo. 2009. All rights reserved. 47
  • 48. Gravatarを表示 Copyright © YusukeAndo. 2009. All rights reserved. 48
  • 49. 実習 2-4 Gravatarの利用 views/helpers/gravatar.php を作成 controllers/posts_contrller.phpに設定追加 views/posts/index.ctpを修正 アイコンが表示されればOK Copyright © YusukeAndo. 2009. All rights reserved. 49
  • 50. AJAXヘルパーの利用
  • 51. AJAXヘルパーとは? JavaScriptを書かずにAJAX的な動きを提供する 画面の書き換えにはdivタグのidなどを利用 AJAXから送信したデータをコントローラで扱える prototype.js と scriptaculousを利用 →基本的にModelに対して設定をするだけでOK Copyright © YusukeAndo. 2009. All rights reserved. 51
  • 52. AJAXヘルパーを使う ライブラリをダウンロードしてjsフォルダにコピー Scriptaculousのサイトからダウンロードできます AjaxヘルパーとJavascriptヘルパーを設定 Prototypeとscriptaculousをロード RequestHandlerコンポーネントも便利 →基本的にModelに対して設定をするだけでOK Copyright © YusukeAndo. 2009. All rights reserved. 52
  • 53. 実習 2-5 つぶやき登録のAJAX化 controllers/posts_controller.phpを修正 views/posts/index.ctpを修正 それっぽい表示を確認 Copyright © YusukeAndo. 2009. All rights reserved. 53
  • 54. まとめ Copyright © YusukeAndo. 2009. All rights reserved. 54
  • 55. まとめ CakePHPはとても簡単なMVCフレームワーク さまざまな機能を活用することでコード量を大きく減ら す事ができる 必要な情報はマニュアル・API・ネットからゲットする ‚Give back as much as you take‛ ブログに書く、誰かに教えてあげるなど自分が得た以 上のものを誰かに与えてあげましょう Copyright © YusukeAndo. 2009. All rights reserved. 55
  • 56. 質疑応答 ご静聴ありがとうございました。 Copyright © YusukeAndo. 2009. All rights reserved. 56