CakeMatsuriワークショップ
 快適アプリケーション開発入門


            2009/10/30 yandod
                                1
アジェンダ


 CakePHPとは
 つぶやきサービスを作ろう
   セットアップ
   MVCの作成、データの表示
   フォームの扱い、データの保存
   レイアウトの適用‫‏‬



                    2
CakePHPとは



            3
公式サイト




        http://www.cakephp.org/
                                  4
コンセプト




全てのレベルのPHPユーザが
素早く安定したウェブアプリ
ケーションを開発が行える事
つまり


初心者でも手軽に開発がで
  きる親しみやすさ
上級者がとことん使いこんで
  いけるだけの拡張性

      この2つを両立
具体的な特徴

面倒なインストール・設定作業はほぼ皆無
小さなプログラムだけで機能を実現できる
PHP4/PHP5に両対応
サーバやコマンドライン、ライブラリの知識は丌要
Ruby on Railsにとてもよく似たMVCモデル
ルールを知ってると何だか楽になる原則



                              7
2007年頃から日本国内でも爆発的に普及




     着実にユーザ層が拡大中
                       8
東京でのCakePHP勉強会




   30人 → 50人 → 70人 → 140人
                            9
各国でのイベントも活発




              10
つぶやきサービスを作ろう
CakePHPで作るマイクログログ




                    11
今回作成するアプリケーション




    http://labs.strk.jp/code-fight/blog/
                                           12
題材選定の目的

仕様がシンプルで理解しやすい
データ表示、保存、AJAXなどの要素が揃っている
素材の提供を許可してくださったsotarokさんに感謝




                              13
通常は公式サイトからダウンロード




                   14
セットアップ

取得した圧縮ファイルを展開
展開したファイルをPHPが動作する場所へ配置
設定ファイルを修正
コマンドライン作業などは必要なし




                         15
CakePHPのディレクトリ構造


            設定ファイル
            コントローラー(よく使う)
            モデル(よく使う)



            ビュー(よく使う)

            フレームワーク本体


                            16
注意




    セットアップ時に
 変更する設定が環境によっ
  て異なる場合があります
index.phpへアクセス




    上の通りのオールグリーンの表示があればOK
                            18
なんかおかしい例




    mod_rewriteが動いていないとこうなる
                              19
対処方法(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
データベース設定

余計な問題を避ける為に極力 UTF8を使う。
phpMyAdminの設定ミスなどが原因で文字化けが起
こりがち
テーブル名やカラム名はCakePHPのルールに従うと
楽ができます。
好きな名前を使っても、追加の設定を行えば対応で
きます。




                              21
サンプルデータの登録
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
設定ファイル (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
実習 1-0


 ワークショップ用のCakePHP
 をセットアップしてみましょう
http://groups.google.co.jp/group/cakematsuri-workshop

PHPが動く場所に設置
app/config/sql/dump.sqlのデータを登録
database.php.defaultをコピーしてパスワード設定
基本のコーディング作業

処理の入り口を担当するController
データベースとのやりとりやロジックを担当するModel
画面を表示するView




                              25
理屈はともかく・・・




 MVCのパーツを順次作成するのが
      基本のサイクル




                    26
Modelの作成
<?php
class Post extends AppModel
{
   var $name = 'Post';
}




                 app/model/post.php として作成



         ※Modelは標準では単数形の名前になります。


                                            27
Controllerの作成
<?php
class PostsController extends AppController {
var $name = 'Posts';
         var $scaffold;
}




        app/controller/posts_controller.php として作成



                 $scaffoldによりこれだけで動く!


                                                    28
/posts/ の実行結果




     登録・一覧・ソート・更新・削除が可能
                          29
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
Viewの作成

<h1>ほげったー</h1>
<?php echo date(‘Y-m-d’); ?>

        app/views/posts/index.ctp として作成
           (UTF-8で保存する事を忘れずに)




         /posts/index へアクセスされた場合に
              表示する画面を作成します


                                          31
/posts/index の実行結果




          作成したViewが表示される



                           32
(重要)CakePHPの基本ルール

/posts/update にアクセスされた場合
→ PostsControllerのupdate メソッドを実行し
  views/posts/update.ctp を表示
/mypage/home にアクセスされた場合
→ MypageControllerのhome メソッドを実行し
  views/mypage/home.ctp を表示

      ルールを把握してスムーズな作業を!

                                    33
実習 1-1 1-2



Model,Controller,Viewを作る

models/post.php controllers/posts_controller.php
Scaffoldの挙動を確認
Indexアクションと views/posts/index.ctp を作成
自作した画面の表示を確認
データベースから取得したデータを表示する

Modelの機能によりSQLは自動的に実行されて結果
はハッシュとしてControllerで取得できる
ControllerからViewへデータをsetで渡す
Viewでは渡された変数をただ使うだけ




                              35
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
/posts/index の実行結果




   データベースから取得したデータが表示された!

                            37
実習 1-3



  Modelのデータを表示する

views/posts/index.ctpを修正
新しい画面へのリンクの設置
Controllerから渡した変数のデータ構造に注意
よくわからない時はvar_dump
データベースにデータを登録する

データ登録用の画面を作成
Modelの機能により配列変数を渡すだけでデータを
登録できる
Modelに渡すデータ構造を作ってくれるFormHelperを
つかう
入力制限のチェックも可能




                                  39
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
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
validateの追加 post.php

<?php
class Post extends AppModel
{
   var $name = 'Post';
   var $validate = array(
     'body' => array(
       'rule' => array('maxLength', 140),
       'allowEmpty' => false),
   );
}


                                            42
/posts/add の実行結果




       入力検証付きの登録画面ができた
                         43
/posts/add の実行結果




        正しい入力をすれば登録される
                         44
実習 1-4



    データ登録機能を作る

views/posts/add.ctp と addアクションを作成
models/post.phpにvalidateの設定を追加
入力チェックの挙動とデータ登録を確認
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
/posts/delete/{id} の実行結果




      urlに付不したidのレコードが削除される。
     必要であればindexなどの画面にリンクを設置

                               47
できた!

Controllerにアクションを追加
アクション内でModelの処理を呼び出す
ViewでControllerから渡されたデータを表示
Helperなどを利用すると記述内容を削減できる



作業の流れが把握できましたか?

                              48
もうすこしカッコよくする




               49
Paginate

データをページ毎に分けて表示する
Controllerの機能とHelperの機能を使って実現
基本的にはイディオムなので丸覚え、コピペで対処可




                                50
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
Viewの修正 index.ctp

</table>
<?php echo $paginator->prev() ?> &nbsp;
<?php echo $paginator->numbers() ?> &nbsp;
<?php echo $paginator->next() ?>



  ページの末尾にPaginatorヘルパーを呼ぶ処理を追加




                                             52
/posts/index の実行結果




               リンクの表示

                     クエリの自動組立



     自動でクエリを組立てPaginateを実現!
                                53
実習 1-5



     Paginateの組み込み

controllers/posts_controller.phpに設定を追加
views/posts/index.ctp にpaginatorの記述追加
データがページ分けして表示できればOK
レイアウト変更

画面のヘッダー・フッター部分は layoutに存在
通常時はCake標準の default flash などが使われる
デザインを変更する場合は app/view/layouts/ 以
下に default.ctp などを置く
Defalutなど以外を使う場合は layoutプロパティを設
定する




                                    55
レイアウトの変更例


class PostsController extends AppController {
  function help() {
    $this->layout = ‘custom’;
  }
}




 app/view/layouts/custom.ctp をヘッタ・フッタとして利用

                                                56
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
実行結果




                  あとは自由にCSSなどを設定すればOK



Copyright © YusukeAndo. 2009 - . All rights reserved.
素材を適用




                                大幅にそれっぽくなった
Copyright © YusukeAndo. 2009 - . All rights reserved.
実習 1-6



       layoutの組み込み

views/layouts/default.ctpを素材に入れ替える
views/posts/index.ctpを素材に入れ替える
それっぽい表示を確認
まとめ



      61
まとめ

CakePHPはとても簡単はMVCフレームワーク
さまざまな機能を活用することでコード量を大きく減ら
す事ができる
必要な情報はマニュアル・API・ネットからゲットする
‚Give back as much as you take‛
ブログに書く、誰かに教えてあげるなど自分が得た以
上のものを誰かに不えてあげましょう



                                  62
質疑応答




   ご静聴ありがとうございました。




                     63

20091030cakephphandson 01