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

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

20091030cakephphandson 02

1,249

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,249
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

×