20090307cakephphandson 01

9,172 views
9,096 views

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
9,172
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
25
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

20090307cakephphandson 01

  1. 1. CakePHPハンズオン ケイクで始める快適WEB開発 2009/03/07 yandod 1
  2. 2. Thanks 会場を提供してくれたグリーさん 見守ってくれるサポーターさん達 会場までPCを持ってきてくださったみなさん 2
  3. 3. 自己紹介 名前 安藤祐介 yandod PHPについて喋ったり、書いたりしています CakePHPエヴァンジェリスト 猫好き/ゴルフ好き/カレー好き/CakePHP好き 3
  4. 4. アジェンダ CakePHPとは チュートリアルをやってみよう セットアップ CakePHPの基本1 (Controller) CakePHPの基本2 (Model View)‫‏‬ 応用テクニック CakePHPのさまざまな機能 4
  5. 5. CakePHPとは 5
  6. 6. 公式サイト http://www.cakephp.org/ 6
  7. 7. コンセプト 全てのレベルのPHPユーザが 素早く安定したウェブアプリ ケーションを開発が行える事
  8. 8. つまり 初心者でも手軽に開発がで きる親しみやすさ 上級者がとことん使いこんで いけるだけの拡張性 この2つを両立
  9. 9. 具体的な特徴 面倒なインストール・設定作業はほぼ皆無 小さなプログラムだけで機能を実現できる PHP4/PHP5に両対応 サーバやコマンドライン、ライブラリの知識は丌要 Ruby on Railsにとてもよく似たMVCモデル 9
  10. 10. 主な開発者 Larry E. Masters Garrett J. Woodworth Nate Abele PhpNut gwoo _nate_ 20名弱のチームで2005年頃から開発中 10
  11. 11. CakePHPの歴史 2005/03 ‚Cake‛ が公開される 2005/07 phpnutが ‛CakePHP‛ を公開 2005/08 _nate_ がチームに加入 2005/09 gwooがチームに加入 2006/05 CakePHP1.0 1.1 2008/01 CakePHP1.2-beta 2009/12 CakePHP1.2.0 11
  12. 12. 2007年頃から日本国内でも爆発的に普及 着実にユーザ層が拡大中 12
  13. 13. 東京でのCakePHP勉強会 30人 → 50人 → 70人 → 140人 13
  14. 14. 各国でのイベントも活発 14
  15. 15. 感謝の気持ちも忘れずに ケイクはあなたを待ってます 15
  16. 16. チュートリアルをやってみよう 定番のブログチュートリアルを1.2で 16
  17. 17. チュートリアルの流れ ダウンロード・セットアップ データベース・テーブル作成 設定ファイル編集 基本のコーディング作業 17
  18. 18. 今回の元ネタ http://book.cakephp.org/ja/complete/219 18
  19. 19. チュートリアルの目的 多くの人が仕様を理解しているブログが題材 (一覧表示・投稿・編集・削除) アプリケーション作成の流れの把握 細かい機能や拡張は後回しでOK! 19
  20. 20. ダウンロード 20
  21. 21. ダウンロード 21
  22. 22. ダウンロード 寄付はまたの機会に。 22
  23. 23. セットアップ 取得した圧縮ファイルを展開 展開したファイルをPHPが動作する場所へ ディレクトリ構造を確認しておきましょう 23
  24. 24. CakePHPのディレクトリ構造 設定ファイル コントローラー(よく使う) モデル(よく使う) ビュー(よく使う) フレームワーク本体 24
  25. 25. index.phpへアクセス 上の通りの表示があればOK 25
  26. 26. なんかおかしい例 mod_rewriteが動いていないとこうなる 26
  27. 27. 対処方法 (推奨)httpd.conf を変更し、apache再起動 #LoadModule proxy_ftp_module modules/mod_proxy_ftp.so #LoadModule rewrite_module modules/mod_rewrite.so コメント解除 LoadModule setenvif_module modules/mod_setenvif.so Apacheの設定が変更できない場合は core.php //Configure::write('App.baseUrl', env('SCRIPT_NAME')); コメント解除 後者の場合は今後のURLに常にindex.phpを付ける事に /pages/home → index.php/pages/home 27
  28. 28. データベーステーブルの作成 (10.1.2)‫‏‬ CREATE TABLE posts ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, title VARCHAR(50), body TEXT, created DATETIME DEFAULT NULL, modified DATETIME DEFAULT NULL ); INSERT INTO posts (title,body,created)‫‏‬ VALUES ('タイトル', 'これは、記事の本文です。', NOW()); INSERT INTO posts (title,body,created)‫‏‬ VALUES ('またタイトル', 'そこに本文が続きます。', NOW()); INSERT INTO posts (title,body,created)‫‏‬ VALUES ('タイトルの逆襲', 'こりゃ本当に面白そう!うそ。', NOW()); 28
  29. 29. データベース設定での注意 余計な問題を避ける為に極力 UTF8を使う。 テーブル名やカラム名はCakePHPのルールに従うと 楽ができます。 好きな名前を使っても、追加の設定を行えば対応で きます。 29
  30. 30. 設定ファイル (database.php)の作成(10.1.3)‫‏‬ var $default = array( 'driver' => 'mysql', 'persistent' => 'false', 'host' => 'localhost', 'port' => '', 'login' => 'cakeBlog', 'password' => 'c4k3-rUl3Z', 'database' => 'cake_blog_tutorial', 'schema' => '', 'prefix' => '', 'encoding' => 'utf8'//日本語ではencodingを指定しましょう。 ); app/config/database.php.default をコピーして作成 30
  31. 31. 追加の設定(あとちょっとだけ)‫‏‬ app/config/core.php の Seculity.saltを変更 app/tmp 以下のディレクトリを書き込み可能に (Linuxなどの場合)‫‏‬ Apacheのmod_rewriteが有効になっていない場合は App.baseUrl の行のコメントを解除 31
  32. 32. 基本のコーディング作業 処理の入り口を担当するController データベースとのやりとりやロジックを担当するModel 画面を表示するView MVCのパーツを順次作成するのが 基本のサイクル 32
  33. 33. Modelの作成 <?php class Post extends AppModel { var $name = 'Post'; } ?> app/model/post.php として作成 ※Modelは標準では単数形の名前になります。 33
  34. 34. Controllerの作成 <?php class PostsController extends AppController { var $name = 'Posts'; var $scaffold; } ?> app/controller/posts_controller.php として作成 $scaffoldによりこれだけで動く! 34
  35. 35. /posts/ の実行結果 登録・一覧・更新・削除が可能 (管理程度ならこれでOK)‫‏‬ 35
  36. 36. Controllerへのアクションの追加 <?php class PostsController extends AppController { var $name = 'Posts'; //var $scaffold; //丌要なので消す function index() { $this->set('posts', $this->Post->find('all')); } } Viewに対してpostsという名前でデータを渡す ?> Index メソッドを追加した事により、/posts/index へアク セスされた場合に実行する処理を定義できます 36
  37. 37. Viewの作成 <h1>ほげほげブログ</h1> <?php echo date(‘Y-m-d’); ?> app/views/posts/index.ctp として作成 (UTF-8で保存する事を忘れずに) /posts/index へアクセスされた場合に 表示する画面を作成します 37
  38. 38. /posts/index の実行結果 38
  39. 39. (重要)CakePHPの基本ルール /posts/update にアクセスされた場合 → PostsControllerのupdate メソッドを実行し views/posts/update.ctp を表示 /mypage/home にアクセスされた場合 → MypageControllerのhome メソッドを実行し views/mypage/home.ctp を表示 ルールを把握してスムーズな作業を! 39
  40. 40. Viewの作成2 (10.1.8)‫‏‬ <h1>ほげほげブログ</h1> <table> <tr><th>Id</th><th>Title</th><th>Created</th></tr> <?php foreach ($posts as $post): ?> <tr> <td><?php echo $post['Post']['id']; ?></td> <td><?php echo $html->link($post['Post']['title'], quot;/posts/view/quot;.$post['Post']['id']); ?></td> <td><?php echo $post['Post']['created']; ?></td> </tr> <?php endforeach; ?> </table> Controllerでセットした名前の変数を表示する 40
  41. 41. /posts/index の実行結果 /posts/view/{id} へのリンク PostsControllerにviewアクションはないのでリンク先はエ ラー画面 41
  42. 42. Controllerへのアクションの追加 <?php class PostsController extends AppController { var $name = 'Posts'; function index() { $this->set('posts', $this->Post->find('all')); } function view($id = null) { $this->Post->id = $id; $this->set('post', $this->Post->read()); } } ?> /posts/view 時の処理を追加 42
  43. 43. Viewの追加 view.ctp <h1><?php echo $post['Post']['title']?></h1> <p><small>Created: <?php echo $post['Post']['created']?> </small></p> <p><?php echo $post['Post']['body']?></p> /posts/view 時の画面を追加 43
  44. 44. /posts/view の実行結果 表示機能が完成 44
  45. 45. Controllerへのアクションの追加(抜粋)‫‏‬ <?php class PostsController extends AppController { function add() { if (!empty($this->data)) { if ($this->Post->save($this->data)) { $this->flash('Your post has been saved.','/posts'); } } } } ?> /posts/add 時の処理を追加 45
  46. 46. Viewの追加 add.ctp <h1>Add Post</h1> <?php echo $form->create('Post'); echo $form->input('title'); echo $form->input('body', array('rows' => '3')); echo $form->end('Save Post'); ?> /posts/add 時の画面を追加 FormHelperでフォームを出力 46
  47. 47. validateの追加 post.php <?php class Post extends AppModel { var $name = 'Post'; var $validate = array( 'title' => array('rule' => array('minLength', 1)), 'body' => array('rule' => array('minLength', 1))‫‏‬ ); } ?> 47
  48. 48. /posts/add の実行結果 入力検証付きの登録画面ができた 48
  49. 49. Controllerへのアクションの追加(抜粋)‫‏‬ <?php class PostsController extends AppController { function delete($id) { $this->Post->del($id); $this->flash('The post with id: '.$id.' has been deleted.', '/posts'); } } メッセージを表示後に /postsへ移動する ?> /posts/delete 時の処理を追加 画面は存在しないのでViewは丌要 49
  50. 50. /posts/delete/{id} の実行結果 urlに付不したidのレコードが削除される。 必要であればindexなどの画面にリンクを設置 50
  51. 51. Controllerへのアクションの追加(抜粋)‫‏‬ class PostsController extends AppController { function edit($id = null) { $this->Post->id = $id; if (empty($this->data)) { $this->data = $this->Post->read(); } else { if ($this->Post->save($this->data['Post'])) { $this->flash('Your post has been updated.','/posts'); } } } 51
  52. 52. Viewの追加 edit.ctp <h1>Edit Post</h1> <?php echo $form->create('Post',array(‘action’=>’edit’)); echo $form->hidden(‘id’); echo $form->input('title'); echo $form->input('body', array('rows' => '3')); echo $form->input('id', array('type'=>'hidden')); echo $form->end('Save Post'); ?> /posts/edit 時の画面を追加 ほとんどAddと同じだが、少しだけ違う 52
  53. 53. /posts/edit/{id} の実行結果 編集機能が動作する 入力検証も登録時と同じように動作 53
  54. 54. できた! Controllerにアクションを追加 アクション内でModelの処理を呼び出す ViewでControllerから渡されたデータを表示 Helperなどを利用すると記述内容を削減できる 作業の流れが把握できましたか? 54
  55. 55. CakePHPのさまざまな機能達 55
  56. 56. まだまだ多くの機能がCakePHPには存在 いつでも使える機能 デバッグ機能・コードシュガー Controllerから利用する機能 レイアウトの変更・任意のモデル利用・セッション Modelから利用する機能 データ取得方法・テーブル変更・リレーション Viewから利用する機能 ヘルパー・エレメント 56
  57. 57. いつでも使える機能 57
  58. 58. デバッグ機能 Core.php 内の設定により有効化 エラーの発生箇所・SQLの実行状況などが確認可能 58
  59. 59. コードシュガー コーディングをちょっと楽にしてくれる裏ワザ eh echo htmlspecialchars の代わりに利用可能 pr <pre>print_r()</pre>の代わりに利用可能 a aa array(,,,,) array( ‘ ‘ => ‘’, ‘’ => ‘’)の意味 59
  60. 60. シュガーを使うと array(‘action’ => ‘edit’, ‘method’ => ‘GET’))‫‏‬ aa(‘action’,‘edit’,’method’,’GET’))‫‏‬ echo htmlspecialchars($hoge,ENT_QUOTES); e(h($hoge)); 煩雑なコードを大胆に短くできる 60
  61. 61. Controllerで使える機能 61
  62. 62. レイアウト変更 画面のヘッダー・フッター部分は layoutに存在 通常時はCake標準の default flash などが使われる デザインを変更する場合は app/view/layouts/ 以 下に default.ctp などを置く Defalutなど以外を使う場合は layoutプロパティを設 定する 62
  63. 63. レイアウトの変更例 class PostsController extends AppController { function help() { $this->layout = ‘custom’; } } app/view/layouts/custom.ctp をヘッタ・フッタとして利用 63
  64. 64. app/views/layouts/custom.ctp の内容 <html> <head> <title><?php echo $title_for_layout; ?></title> </head> <?php echo $content_for_layout; ?> </html> $content_for_layout にviewの処理結果が入っている 64
  65. 65. 実行結果 あとは自由にCSSなどを設定すればOK Copyright © YusukeAndo. 2009 - . All rights reserved.
  66. 66. 任意のモデルの利用 Controllerが利用するModelは任意に変更可能 複数形などになじまない場合は任意で設定 大量に設定しすぎるのは考えもの class PostsController extends AppController { var $uses = array(‘Toukou’,’Tomodaci’); } Toukou.php Tomodaci.php をModelとして使用 66
  67. 67. セッション Controllerの機能を拡張するComponentの機能を通 じてセッションを利用する事ができる 標準設定では非常に短時間でデータが消える点に注 意 (core.php のsefurity.levelで設定)‫‏‬ $this->Session->write(‘セッション名’,データ); $this->Session->read(‘セッション名’); 複数の画面でデータを引き継ぐような場合に利用する 67
  68. 68. Modelで使える機能 68
  69. 69. 対象テーブル・主キーの指定 モデル名を元に自動でテーブルを決定 例) モデル名:Book 対象テーブル:books idという名称のカラムを主キーとして認識 上記のルール外のテーブル、主キーを指定した い場合はモデルのプロパティに設定を行う 対象テーブルにNULLを指定する事でDBを使用 しないモデルとする事も可能 69
  70. 70. 対象テーブル・主キーの指定例 class User extends AppModel { var $name = ‘User'; var $useTable = ‘user_account’; 使用するテーブル名 var $primaryKey = ‘login_id’; 主キーのカラム名 } 暗黙的なルールに従うよりも把握しやすい場合も 既存のテーブルでCakeを使う場合の必須TIPS 70
  71. 71. データ取得 配列化したパラメータを元に自動でクエリを実 行し、データを取得する 取得対象カラム、ORDER LIMITなどが指定可能 自力で構築したWHERE句の指定も可能 全ての引数には初期値あり find(‘all’,オプション) 71
  72. 72. データ取得 class PostsController extends AppController { function hoge() { $param = array( 'conditions' => aa( 'id >',1 ), 'order' => 'title DESC' ); $data = $this->Post->find('all',$param); $this->set('posts',$data); $this->render('index'); }} パラメータの渡し方によってさまざまなクエリを実行する事が可能 72
  73. 73. 実行例 →パラメータを元にWHERE句等を生成して実行 73
  74. 74. Viewで使える機能 74
  75. 75. ヘルパー View中で共通で行うさまざまな処理をまとめたもの 標準でHtml Form のヘルパーが利用可能 その他のヘルパーを利用する際はControllerの helpersプロパティに使いたいヘルパーを指定する 例えばRSSを出力したりもできる http://book.cakephp.org/ja/view/483/ 75
  76. 76. ヘルパーの使用例 class PostsController extends AppController { $helpers = array(‘Html’,’Form’,’Text’); } <style> .highlight{ background-color:#FFFF00; } </style> <p><?php echo $text->highlight($post['Post']['body'],quot;本文 quot;)?></p> 76
  77. 77. 実行例 →CSSを利用して反転表示を実現 77
  78. 78. 機能の利用方法の情報源 公式マニュアル http://book.cakephp.org/ja APIドキュメント http://api.cakephp.org/ ユニットテストケース https://svn.cakephp.org/repo/trunk/cake/1.2.x.x/cake/tests/cases/libs/ 各種書籍・ブログ 78
  79. 79. 過去の勉強会資料・書籍 http://puyo2.upper.jp/cake/ 「CakePHPのModelを使う」 「 CakePHPのHelperを使う」 「 CakePHP1.1 to 1.2」 書籍「CakePHPガイドブック」 より詳細な説明あり 79
  80. 80. チュートリアルを拡張してみる 80
  81. 81. チュートリアルを拡張してみよう デザインの変更 CSSの入れ替え 検索機能の追加 Modelの機能の活用 RSS出力機能の追加 View、Helperの利用 コメント投稿機能の追加 MVCの追加 81
  82. 82. まとめ 82
  83. 83. まとめ CakePHPはいつでも始められる さまざまな機能を活用することでコード量を大きく減ら す事ができる 必要な情報はマニュアル・API・ネットからゲットする ‚Give back as much as you take‛ ブログに書く、誰かに教えてあげるなど自分が得た以 上のものを誰かに不えてあげましょう 83
  84. 84. 質疑応答 ご静聴ありがとうございました。 84

×