Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
3時間濃縮     CakePHP2.1                                    by nipotan3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
本日の主旨   8時間耐久を圧縮  CakePHP2.1の基本骨の髄に(強制的に)刻みこむ 時間が許す範囲で応用技3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
who am I3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
?       CakePHP2実践入門(仮)    技術評論社より今夏出版予定3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
本日のメニュー    MVCの考え方   セットアップの肝 コントローラーの使い方   モデルの使い方   ビューの使い方    応用技の紹介3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
by crabchick     MVCの考え方3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
MVCだらけ3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
CakePHPもMVC    Railsインスパイア系3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
なぜMVC 複雑化するプログラム      整理が必要    分割の経験則 Model View Controller3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
MVCに分割 巨大なプログラム3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
MVCの役割•Model  データや処理(データベース処理)•View  見た目を担当(HTMLの出力)•Controller  入力を受けてモデルとビューを呼ぶ(それ以外) 3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (...
CakePHPの前にふつうのPHPスクリプト  で考えてみます3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
<?php         $keyword = ;         if (isset($_POST[keyword])) {                $keyword = $_POST[keyword];         }     ...
<?php         $keyword = ;         if (isset($_POST[keyword])) {                $keyword = $_POST[keyword];         }     ...
<?php                                    //model.php                                    mysql_connect(localhost,user,passw...
別々にしただけ3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
ひとつの方が楽?3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
問題は量3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
自然発生     進化の答えがMVC3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
CakePHPのMVC                      Controller置き場                        (全ての起点)                       Model置き場              ...
CakePHP習得の為に   Controllerの知識    Modelの知識     Viewの知識 それぞれの理解を深める3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
セットアップの肝3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
ポイント       pdo_mysql      mod_rewrite      PHP5.2以上core.php / database.phpchmod -R 777 app/tmp3時間濃縮CakePHP2.1@札幌 / Yusuke ...
phpinfo()3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
mod_rewriteが無い3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
mod_rewriteの有効化   わりと地雷(勉強会中)3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
rewrite無しの場合 /**   * To configure CakePHP *not* to use mod_rewrite and to   * use CakePHP pretty URLs, remove these .htacce...
準備完了3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
Controllerの使い方3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
典型的なコントローラー<?php// app/Controller/TasksController.phpApp::uses(AppController, Controller);class TasksController extends Ap...
Controllerの必須テク   ディスパッチのルール    $scaffold $uses    $this->render()      $this->set()    $this->redirect()     $this->reques...
ディスパッチアクセスされたURLに応じて適切なコントローラーを   呼び出す機構3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
ページコントローラー     index.php     menu.php    mypage.php に直接URLからアクセス   (ふつうのPHP)3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
フロントコントローラー      index.php  にまずアクセスして、その中でそれぞれの処理に        飛ばす (CakePHPはこの方式)3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
ディスパッチの例/tasks/index→TasksControllerのindex/Oden/umai→OdenControllerのumai/my_page→MyPageControllerのindex3時間濃縮CakePHP2.1@札幌 ...
routes.phpなら任意のマッピングも追加可能(最後にURLだけ変更とか)そのままでOKなら設定不要3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
$scaffold   public $scaffold;とするだけで標準機能が動く           ※動作確認などに便利3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
$usesclass MyController extends AppController {    public $uses = array( Task , User );} コントローラーが使うモデルのリスト  省略時はコントローラー名と同...
$this->render()        $this->render( hoge );   任意のViewを呼び出す省略時はアクション名と同名を呼ぶ  同じViewを使いまわす事もできる!3時間濃縮CakePHP2.1@札幌 / Yusuk...
$this->set()   $this->set( hoge , this is data );    任意のデータをViewへ渡す    スカラー値も配列も渡せる    Viewで使いたいデータはset()!3時間濃縮CakePHP2.1@...
$this->redirect()     $this->redirect( oden/umai );   任意のページへリダイレクト        $this->flash() や   $this->Session->setFlash()   ...
$this->request         $this->request->data         $this->request->pass          $this->request->is()フォームの入力内容などにアクセス可$_P...
Modelの使い方3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
典型的なモデル<?php// app/Model/Task.phpApp::uses(AppModel, Model);class Task extends AppModel {   public $useTable = tasks;} 3時間...
Modelの必須テク        $useTable       $primaryKey           find()     save() saveField()    updateAll() delete()        delete...
Modelの必須テク2      $validates     $belongsTo $hasOne / $hasMany$hasAndBelongsToMany3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
Model手強い    Modelを制する者は      Cakeを制す3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
$useTable   public $useTable = tablename ;モデルが処理を行うテーブル名を指定 省略時はモデル名の複数形になる falseにするとテーブル無しモデル          ここもはまりやすい3時間濃縮Cake...
$primaryKey       public $primaryKey = id ;   テーブルの主キーを設定      省略時は id 既存のテーブルを使う場合に便利3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@y...
find()      $this->find( all ,$options);     $this->find( first ,$options);    $this->find( count ,$options);     $this->find( l...
find()のオプションarray(   conditions => array(Model.field => $thisValue),   recursive => 1, //int   fields => array(Model.field1, D...
find()のオプション3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
find()のオプションarray(   conditions => array(Model.field => $thisValue),   recursive => 1, //int   fields => array(Model.field1, D...
find( all ) の結果      $data = $this->Hoge->find( all ); $data[0][ Hoge ][ name ]; // Hogeのname$data[0][ Hoge ][ twitter ]; //...
= 以外の比較// field > a のような比較array(   conditions => array(Model.field > => $thisValue),)// field like %a% のような比較array(   conditi...
AND条件 OR条件// ANDarray(   conditions => array(     Model.field < => 100     Model.field > => 20   ),)// ORarray(   conditions...
find( first ) の結果    $data = $this->Hoge->find( first ); $data[ Hoge ][ name ]; // Hogeのname$data[ Hoge ][ twitter ]; // Hogeの...
find( count ) の結果   $data = $this->Hoge->find( count );            数値で帰ってくる3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
find( list ) の結果    $data = $this->Hoge->find( list );           リストで帰ってくる3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
find( threaded )     find( neighbors )3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
save()Model->save($data,$validate = true);渡されたデータを元にデータを保存  INSERT/UPDATEに両対応  主キーがあるかないかで分岐3時間濃縮CakePHP2.1@札幌 / Yusuke An...
saveField()         Model->id = $id;  Model->saveField($name,$value);      単一のフィールドを更新       しかしあまり使わない     (save()で同じ事ができ...
updateAll()Model->updateAll($fields,$condition);条件にマッチするデータを全て更新      あまり使わない (データが少なければ1件づつ  save()でも問題ないので)3時間濃縮CakePHP2....
delete() deleteAll()    Model->delete($id,$cascade); Model->deleteAll($condition,$cascade);   DELETEを実行できる。しかし実際のシステムでDELE...
$validates  public $validate = array(     twitter => array(        rule => notEmpty,        message => Twitter is very imp...
$validatesメッセージや複雑な条件も設定可能3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
アソシエーション     $belongsTo $hasOne / $hasMany$hasAndBelongsToMany3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
$belongsTopublic $belongsTo = array(   Shimokita => array(      foreignKey => friendlist_id   )); モデルが属する上位モデルを指定日記(たくさん) ...
$belongsTo設定さえすれば自動で関連データを取得3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
$hasManypublic $hasMany = array(   Item);モデルが所有している下位モデルを指定  ユーザー ー> 日記(たくさん)3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
$hasMany 複数件の関連データが取得される3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
Viewの使い方3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
Viewの必須テク        Layoutの変更       $this->request      $this->element()         $this->Html        $this->Form3時間濃縮CakePHP2....
Layout3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
Layoutの変更ビューはレイアウトの中に   読み込まれる     標準は  app/View/Layout/default.ctp3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
default.ctpの要所<body><div id="container">    <div id="header">    <h1><?php echo $this->Html->link($cakeDescription, http:/...
CSSなど   <head>       <?php echo $this->Html->charset(); ?>       <title>            <?php echo $cakeDescription ?>:       ...
CSS、画像はwebroot3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
$this->request echo $this->request->data[ name ]リクエストはビューでも取れる  (引き回す必要無し) 3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
$this->elementecho $this->element( template ,$data);テンプレートから別のテン  プレートを読み込む。(変数はオプションで渡す)3時間濃縮CakePHP2.1@札幌 / Yusuke Ando ...
$this->Html$url = array(   controller => hoge ,   action => index);echo $this->Html->link($title,$url);HTMLを生成するヘルパー URLを自...
$this->Formecho $this->Form->create( ModelName );echo $this->Form->input($fieldName);  フォームを生成する 初期値のフィルインやエラーメッセージを自動化3時間濃...
応用技の紹介3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
CakePHPの応用技     MVCのバランス    MVCの各部品を強化    標準の強力な機能群    MVCの各要素に対応3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
ベストプラクティス     モデル層を厚くせよ3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
MVC::BHC                           Behavior   Component                            Model    Controller                    ...
応用技に手を伸ばす時   コードが肥大化した時     まずはHelper    次にComponent    最後にBehavior3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
Helper  Html                   Paginator  Form                    Session  Cache                     Rss   Js3時間濃縮CakePHP2...
Component     Acl                 Pagination    Auth                  Security   Cookie                 SessionRequestHand...
Behavior   TreeContainable 3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
まだある応用技         プラグイン         Coreクラス          Console        ユニットテスト3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
今後の羅針盤    http://book.cakephp.org/2.0/en/    http://book.cakephp.org/2.0/ja/3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
吐き気に勝った!3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
Upcoming SlideShare
Loading in …5
×

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

7,531 views

Published on

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

Published in: Technology
  • Be the first to comment

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

  1. 1. 3時間濃縮 CakePHP2.1 by nipotan3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  2. 2. 本日の主旨 8時間耐久を圧縮 CakePHP2.1の基本骨の髄に(強制的に)刻みこむ 時間が許す範囲で応用技3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  3. 3. who am I3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  4. 4. ? CakePHP2実践入門(仮) 技術評論社より今夏出版予定3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  5. 5. 本日のメニュー MVCの考え方 セットアップの肝 コントローラーの使い方 モデルの使い方 ビューの使い方 応用技の紹介3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  6. 6. by crabchick MVCの考え方3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  7. 7. MVCだらけ3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  8. 8. CakePHPもMVC Railsインスパイア系3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  9. 9. なぜMVC 複雑化するプログラム 整理が必要 分割の経験則 Model View Controller3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  10. 10. MVCに分割 巨大なプログラム3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  11. 11. MVCの役割•Model  データや処理(データベース処理)•View  見た目を担当(HTMLの出力)•Controller  入力を受けてモデルとビューを呼ぶ(それ以外) 3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  12. 12. CakePHPの前にふつうのPHPスクリプト で考えてみます3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  13. 13. <?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>3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  14. 14. <?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)) { Modelへ $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へ3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  15. 15. <?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)) {<?php//index.php$keyword = ; } $data[] = $row; Modelif (isset($_POST[keyword])) { $keyword = $_POST[keyword];} <!-- view.php -->include ‘model.php’; <html>include ‘view.php’; <head><title>テストページ</title></head> Controller <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>; } View ?></ul> </body></html> 3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  16. 16. 別々にしただけ3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  17. 17. ひとつの方が楽?3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  18. 18. 問題は量3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  19. 19. 自然発生 進化の答えがMVC3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  20. 20. CakePHPのMVC Controller置き場 (全ての起点) Model置き場 (データベース関連) View置き場 (HTML関連)3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  21. 21. CakePHP習得の為に Controllerの知識 Modelの知識 Viewの知識 それぞれの理解を深める3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  22. 22. セットアップの肝3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  23. 23. ポイント pdo_mysql mod_rewrite PHP5.2以上core.php / database.phpchmod -R 777 app/tmp3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  24. 24. phpinfo()3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  25. 25. mod_rewriteが無い3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  26. 26. mod_rewriteの有効化 わりと地雷(勉強会中)3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  27. 27. 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を付ける3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  28. 28. 準備完了3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  29. 29. Controllerの使い方3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  30. 30. 典型的なコントローラー<?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); }} 3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  31. 31. Controllerの必須テク ディスパッチのルール $scaffold $uses $this->render() $this->set() $this->redirect() $this->request3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  32. 32. ディスパッチアクセスされたURLに応じて適切なコントローラーを 呼び出す機構3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  33. 33. ページコントローラー index.php menu.php mypage.php に直接URLからアクセス (ふつうのPHP)3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  34. 34. フロントコントローラー index.php にまずアクセスして、その中でそれぞれの処理に 飛ばす (CakePHPはこの方式)3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  35. 35. ディスパッチの例/tasks/index→TasksControllerのindex/Oden/umai→OdenControllerのumai/my_page→MyPageControllerのindex3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  36. 36. routes.phpなら任意のマッピングも追加可能(最後にURLだけ変更とか)そのままでOKなら設定不要3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  37. 37. $scaffold public $scaffold;とするだけで標準機能が動く ※動作確認などに便利3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  38. 38. $usesclass MyController extends AppController { public $uses = array( Task , User );} コントローラーが使うモデルのリスト 省略時はコントローラー名と同一 命名規則で苦しむのは横着するからです 3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  39. 39. $this->render() $this->render( hoge ); 任意のViewを呼び出す省略時はアクション名と同名を呼ぶ 同じViewを使いまわす事もできる!3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  40. 40. $this->set() $this->set( hoge , this is data ); 任意のデータをViewへ渡す スカラー値も配列も渡せる Viewで使いたいデータはset()!3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  41. 41. $this->redirect() $this->redirect( oden/umai ); 任意のページへリダイレクト $this->flash() や $this->Session->setFlash() と組みわせてメッセージ表示 登録完了やエラー時によく使う3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  42. 42. $this->request $this->request->data $this->request->pass $this->request->is()フォームの入力内容などにアクセス可$_POSTなどを使った者は校庭10周に処す3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  43. 43. Modelの使い方3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  44. 44. 典型的なモデル<?php// app/Model/Task.phpApp::uses(AppModel, Model);class Task extends AppModel { public $useTable = tasks;} 3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  45. 45. Modelの必須テク $useTable $primaryKey find() save() saveField() updateAll() delete() deleteAll()3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  46. 46. Modelの必須テク2 $validates $belongsTo $hasOne / $hasMany$hasAndBelongsToMany3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  47. 47. Model手強い Modelを制する者は Cakeを制す3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  48. 48. $useTable public $useTable = tablename ;モデルが処理を行うテーブル名を指定 省略時はモデル名の複数形になる falseにするとテーブル無しモデル ここもはまりやすい3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  49. 49. $primaryKey public $primaryKey = id ; テーブルの主キーを設定 省略時は id 既存のテーブルを使う場合に便利3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  50. 50. find() $this->find( all ,$options); $this->find( first ,$options); $this->find( count ,$options); $this->find( list ,$options); $this->find( threaded ,$options); $this->find( neighbors ,$options);オプション次第で自在にSQL文を実行 (オプションが多い)3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  51. 51. find()のオプション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) 3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  52. 52. find()のオプション3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  53. 53. find()のオプション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()にこのオプションを使う 3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  54. 54. find( all ) の結果 $data = $this->Hoge->find( all ); $data[0][ Hoge ][ name ]; // Hogeのname$data[0][ Hoge ][ twitter ]; // Hogeのtwitter3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  55. 55. = 以外の比較// field > a のような比較array( conditions => array(Model.field > => $thisValue),)// field like %a% のような比較array( conditions => array(Model.field like => % .$thisValue. % ),) キー名にスペースを空けて演算子 3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  56. 56. AND条件 OR条件// ANDarray( conditions => array( Model.field < => 100 Model.field > => 20 ),)// ORarray( conditions => array( OR => array( Model.field => 10, Model.type => A , ) ),) 3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  57. 57. find( first ) の結果 $data = $this->Hoge->find( first ); $data[ Hoge ][ name ]; // Hogeのname$data[ Hoge ][ twitter ]; // Hogeのtwitter3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  58. 58. find( count ) の結果 $data = $this->Hoge->find( count ); 数値で帰ってくる3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  59. 59. find( list ) の結果 $data = $this->Hoge->find( list ); リストで帰ってくる3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  60. 60. find( threaded ) find( neighbors )3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  61. 61. save()Model->save($data,$validate = true);渡されたデータを元にデータを保存 INSERT/UPDATEに両対応 主キーがあるかないかで分岐3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  62. 62. saveField() Model->id = $id; Model->saveField($name,$value); 単一のフィールドを更新 しかしあまり使わない (save()で同じ事ができる)3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  63. 63. updateAll()Model->updateAll($fields,$condition);条件にマッチするデータを全て更新 あまり使わない (データが少なければ1件づつ save()でも問題ないので)3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  64. 64. delete() deleteAll() Model->delete($id,$cascade); Model->deleteAll($condition,$cascade); DELETEを実行できる。しかし実際のシステムでDELETEは使わず削除フラグなどで操作する事が多い。3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  65. 65. $validates public $validate = array( twitter => array( rule => notEmpty, message => Twitter is very important ), name => array( rule => notEmpty, ) ); 配列で設定したとおりに検査 save前に実行される3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  66. 66. $validatesメッセージや複雑な条件も設定可能3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  67. 67. アソシエーション $belongsTo $hasOne / $hasMany$hasAndBelongsToMany3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  68. 68. $belongsTopublic $belongsTo = array( Shimokita => array( foreignKey => friendlist_id )); モデルが属する上位モデルを指定日記(たくさん) ー> ユーザー(1)3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  69. 69. $belongsTo設定さえすれば自動で関連データを取得3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  70. 70. $hasManypublic $hasMany = array( Item);モデルが所有している下位モデルを指定 ユーザー ー> 日記(たくさん)3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  71. 71. $hasMany 複数件の関連データが取得される3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  72. 72. Viewの使い方3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  73. 73. Viewの必須テク Layoutの変更 $this->request $this->element() $this->Html $this->Form3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  74. 74. Layout3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  75. 75. Layoutの変更ビューはレイアウトの中に 読み込まれる 標準は app/View/Layout/default.ctp3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  76. 76. 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> 3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  77. 77. 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>3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  78. 78. CSS、画像はwebroot3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  79. 79. $this->request echo $this->request->data[ name ]リクエストはビューでも取れる (引き回す必要無し) 3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  80. 80. $this->elementecho $this->element( template ,$data);テンプレートから別のテン プレートを読み込む。(変数はオプションで渡す)3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  81. 81. $this->Html$url = array( controller => hoge , action => index);echo $this->Html->link($title,$url);HTMLを生成するヘルパー URLを自動生成して便利 (手動でタグは書かない)3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  82. 82. $this->Formecho $this->Form->create( ModelName );echo $this->Form->input($fieldName); フォームを生成する 初期値のフィルインやエラーメッセージを自動化3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  83. 83. 応用技の紹介3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  84. 84. CakePHPの応用技 MVCのバランス MVCの各部品を強化 標準の強力な機能群 MVCの各要素に対応3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  85. 85. ベストプラクティス モデル層を厚くせよ3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  86. 86. MVC::BHC Behavior Component Model Controller Helper View3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  87. 87. 応用技に手を伸ばす時 コードが肥大化した時 まずはHelper 次にComponent 最後にBehavior3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  88. 88. Helper Html Paginator Form Session Cache Rss Js3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  89. 89. Component Acl Pagination Auth Security Cookie SessionRequestHandler 3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  90. 90. Behavior TreeContainable 3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  91. 91. まだある応用技 プラグイン Coreクラス Console ユニットテスト3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  92. 92. 今後の羅針盤 http://book.cakephp.org/2.0/en/ http://book.cakephp.org/2.0/ja/3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)
  93. 93. 吐き気に勝った!3時間濃縮CakePHP2.1@札幌 / Yusuke Ando (@yando)

×