Anúncio
Anúncio

Mais conteúdo relacionado

Apresentações para você(20)

Anúncio

Similar a 20091030cakephphandson 01(20)

Mais de Yusuke Ando(20)

Anúncio

20091030cakephphandson 01

  1. CakeMatsuriワークショップ 快適アプリケーション開発入門 2009/10/30 yandod 1
  2. アジェンダ CakePHPとは つぶやきサービスを作ろう セットアップ MVCの作成、データの表示 フォームの扱い、データの保存 レイアウトの適用‫‏‬ 2
  3. CakePHPとは 3
  4. 公式サイト http://www.cakephp.org/ 4
  5. コンセプト 全てのレベルのPHPユーザが 素早く安定したウェブアプリ ケーションを開発が行える事
  6. つまり 初心者でも手軽に開発がで きる親しみやすさ 上級者がとことん使いこんで いけるだけの拡張性 この2つを両立
  7. 具体的な特徴 面倒なインストール・設定作業はほぼ皆無 小さなプログラムだけで機能を実現できる PHP4/PHP5に両対応 サーバやコマンドライン、ライブラリの知識は丌要 Ruby on Railsにとてもよく似たMVCモデル ルールを知ってると何だか楽になる原則 7
  8. 2007年頃から日本国内でも爆発的に普及 着実にユーザ層が拡大中 8
  9. 東京でのCakePHP勉強会 30人 → 50人 → 70人 → 140人 9
  10. 各国でのイベントも活発 10
  11. つぶやきサービスを作ろう CakePHPで作るマイクログログ 11
  12. 今回作成するアプリケーション http://labs.strk.jp/code-fight/blog/ 12
  13. 題材選定の目的 仕様がシンプルで理解しやすい データ表示、保存、AJAXなどの要素が揃っている 素材の提供を許可してくださったsotarokさんに感謝 13
  14. 通常は公式サイトからダウンロード 14
  15. セットアップ 取得した圧縮ファイルを展開 展開したファイルをPHPが動作する場所へ配置 設定ファイルを修正 コマンドライン作業などは必要なし 15
  16. CakePHPのディレクトリ構造 設定ファイル コントローラー(よく使う) モデル(よく使う) ビュー(よく使う) フレームワーク本体 16
  17. 注意 セットアップ時に 変更する設定が環境によっ て異なる場合があります
  18. index.phpへアクセス 上の通りのオールグリーンの表示があればOK 18
  19. なんかおかしい例 mod_rewriteが動いていないとこうなる 19
  20. 対処方法(mod_rewriteの設定) (推奨)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 20
  21. データベース設定 余計な問題を避ける為に極力 UTF8を使う。 phpMyAdminの設定ミスなどが原因で文字化けが起 こりがち テーブル名やカラム名はCakePHPのルールに従うと 楽ができます。 好きな名前を使っても、追加の設定を行えば対応で きます。 21
  22. サンプルデータの登録 CREATE TABLE IF NOT EXISTS `posts` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `body` text COLLATE utf8_unicode_ci, `created` datetime DEFAULT NULL, `modified` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; INSERT INTO `posts` (`id`, `user_id`, `body`, `created`, `modified`) VALUES (1, 1, 'これは、記事の本文です。', '2009-10-10 01:06:07', '2009-10-10 01:23:17'), (2, 1, 'そこに本文が続きます。', '2009-10-10 01:06:07', '2009-10-10 01:23:58'), (3, 1, 'こりゃ本当に面白そう!うそ。', '2009-10-10 01:06:07', '2009-10-10 01:24:08'), 22
  23. 設定ファイル (database.php)の作成 class DATABASE_CONFIG { var $default = array( 'driver' => 'mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'root', 'password' => '', 'database' => 'matsutter', 文字化け対策 'encoding' => 'utf8', 'prefix' => '', ); app/config/database.php.default をコピーして作成 23
  24. 実習 1-0 ワークショップ用のCakePHP をセットアップしてみましょう http://groups.google.co.jp/group/cakematsuri-workshop PHPが動く場所に設置 app/config/sql/dump.sqlのデータを登録 database.php.defaultをコピーしてパスワード設定
  25. 基本のコーディング作業 処理の入り口を担当するController データベースとのやりとりやロジックを担当するModel 画面を表示するView 25
  26. 理屈はともかく・・・ MVCのパーツを順次作成するのが 基本のサイクル 26
  27. Modelの作成 <?php class Post extends AppModel { var $name = 'Post'; } app/model/post.php として作成 ※Modelは標準では単数形の名前になります。 27
  28. Controllerの作成 <?php class PostsController extends AppController { var $name = 'Posts'; var $scaffold; } app/controller/posts_controller.php として作成 $scaffoldによりこれだけで動く! 28
  29. /posts/ の実行結果 登録・一覧・ソート・更新・削除が可能 29
  30. 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 へアク セスされた場合に実行する処理を定義できます 30
  31. Viewの作成 <h1>ほげったー</h1> <?php echo date(‘Y-m-d’); ?> app/views/posts/index.ctp として作成 (UTF-8で保存する事を忘れずに) /posts/index へアクセスされた場合に 表示する画面を作成します 31
  32. /posts/index の実行結果 作成したViewが表示される 32
  33. (重要)CakePHPの基本ルール /posts/update にアクセスされた場合 → PostsControllerのupdate メソッドを実行し views/posts/update.ctp を表示 /mypage/home にアクセスされた場合 → MypageControllerのhome メソッドを実行し views/mypage/home.ctp を表示 ルールを把握してスムーズな作業を! 33
  34. 実習 1-1 1-2 Model,Controller,Viewを作る models/post.php controllers/posts_controller.php Scaffoldの挙動を確認 Indexアクションと views/posts/index.ctp を作成 自作した画面の表示を確認
  35. データベースから取得したデータを表示する Modelの機能によりSQLは自動的に実行されて結果 はハッシュとしてControllerで取得できる ControllerからViewへデータをsetで渡す Viewでは渡された変数をただ使うだけ 35
  36. ViewでControllerのデータを扱う <?php echo $html->link('つぶやく','/posts/add') ?> <table> <tr><th>Id</th><th>user_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 $post['Post']['user_id']; ?></td> <td><?php echo $post['Post']['body']; ?></td> <td><?php echo $post['Post']['created']; ?></td> </tr> <?php endforeach; ?> </table> 36
  37. /posts/index の実行結果 データベースから取得したデータが表示された! 37
  38. 実習 1-3 Modelのデータを表示する views/posts/index.ctpを修正 新しい画面へのリンクの設置 Controllerから渡した変数のデータ構造に注意 よくわからない時はvar_dump
  39. データベースにデータを登録する データ登録用の画面を作成 Modelの機能により配列変数を渡すだけでデータを 登録できる Modelに渡すデータ構造を作ってくれるFormHelperを つかう 入力制限のチェックも可能 39
  40. 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 時の処理を追加 40
  41. Viewの追加 add.ctp <h1>Add Post</h1> <?php echo $form->create('Post'); echo $form->input(‘user_id'); echo $form->input('body', array('rows' => '3')); echo $form->end('Save Post'); ?> /posts/add 時の画面を追加 FormHelperでフォームを出力 41
  42. validateの追加 post.php <?php class Post extends AppModel { var $name = 'Post'; var $validate = array( 'body' => array( 'rule' => array('maxLength', 140), 'allowEmpty' => false), ); } 42
  43. /posts/add の実行結果 入力検証付きの登録画面ができた 43
  44. /posts/add の実行結果 正しい入力をすれば登録される 44
  45. 実習 1-4 データ登録機能を作る views/posts/add.ctp と addアクションを作成 models/post.phpにvalidateの設定を追加 入力チェックの挙動とデータ登録を確認
  46. 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は丌要 46
  47. /posts/delete/{id} の実行結果 urlに付不したidのレコードが削除される。 必要であればindexなどの画面にリンクを設置 47
  48. できた! Controllerにアクションを追加 アクション内でModelの処理を呼び出す ViewでControllerから渡されたデータを表示 Helperなどを利用すると記述内容を削減できる 作業の流れが把握できましたか? 48
  49. もうすこしカッコよくする 49
  50. Paginate データをページ毎に分けて表示する Controllerの機能とHelperの機能を使って実現 基本的にはイディオムなので丸覚え、コピペで対処可 50
  51. Controllerへの設定追加(抜粋)‫‏‬ <?php class PostsController extends AppController { var $name = 'Posts'; var $paginate = array( 'order' => array('Post.id' => 'DESC'), 'limit' => 10 ); ソートなどの設定 function index() { $this->set('posts', $this->paginate('Post')); } Paginateメソッドを使う Modelのfindの代わりにControllerのPaginateを使う 51
  52. Viewの修正 index.ctp </table> <?php echo $paginator->prev() ?> &nbsp; <?php echo $paginator->numbers() ?> &nbsp; <?php echo $paginator->next() ?> ページの末尾にPaginatorヘルパーを呼ぶ処理を追加 52
  53. /posts/index の実行結果 リンクの表示 クエリの自動組立 自動でクエリを組立てPaginateを実現! 53
  54. 実習 1-5 Paginateの組み込み controllers/posts_controller.phpに設定を追加 views/posts/index.ctp にpaginatorの記述追加 データがページ分けして表示できればOK
  55. レイアウト変更 画面のヘッダー・フッター部分は layoutに存在 通常時はCake標準の default flash などが使われる デザインを変更する場合は app/view/layouts/ 以 下に default.ctp などを置く Defalutなど以外を使う場合は layoutプロパティを設 定する 55
  56. レイアウトの変更例 class PostsController extends AppController { function help() { $this->layout = ‘custom’; } } app/view/layouts/custom.ctp をヘッタ・フッタとして利用 56
  57. 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の処理結果が入っている 57
  58. 実行結果 あとは自由にCSSなどを設定すればOK Copyright © YusukeAndo. 2009 - . All rights reserved.
  59. 素材を適用 大幅にそれっぽくなった Copyright © YusukeAndo. 2009 - . All rights reserved.
  60. 実習 1-6 layoutの組み込み views/layouts/default.ctpを素材に入れ替える views/posts/index.ctpを素材に入れ替える それっぽい表示を確認
  61. まとめ 61
  62. まとめ CakePHPはとても簡単はMVCフレームワーク さまざまな機能を活用することでコード量を大きく減ら す事ができる 必要な情報はマニュアル・API・ネットからゲットする ‚Give back as much as you take‛ ブログに書く、誰かに教えてあげるなど自分が得た以 上のものを誰かに不えてあげましょう 62
  63. 質疑応答 ご静聴ありがとうございました。 63
Anúncio