SlideShare a Scribd company logo
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

More Related Content

PDF
FuelPHP Osu Nagoya vol.1
PDF
10分でわかるFuelPHP @ 2011/12
KEY
FuelPHPをさわってみて
PDF
Ruby on Rails Tutorial
PDF
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
PDF
Fuel php osc tokyo2012
PDF
PHP勉強会 #51
PDF
15分でCakePHPを始める方法(Nseg 2013-11-09 )
FuelPHP Osu Nagoya vol.1
10分でわかるFuelPHP @ 2011/12
FuelPHPをさわってみて
Ruby on Rails Tutorial
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
Fuel php osc tokyo2012
PHP勉強会 #51
15分でCakePHPを始める方法(Nseg 2013-11-09 )

What's hot (20)

PDF
Ec cube開発合宿 プラグインセミナー
PDF
実"戦"CakePHP Plugin
PDF
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
PDF
.htaccessによるリダイレクト徹底解説
PDF
はじめての FuelPHP
PDF
CodeIgniter入門
PPTX
今、最も勢いのあるWebフレームワーク「fuel php」
KEY
EC-CUBEプラグイン講義
PDF
Vue入門
PDF
NetBeansではじめる FuelPHP
KEY
最近、僕がハマったFuelPHPの紹介
PDF
FuelPHPで3種のprofilerを使ってみた
PPTX
FuelPHP - フレームワーク4本勝負 @PHPカンファレンス関西2014
PDF
Ansible2.9 ネットワーク対応のアップデート #ansiblejp
PDF
Flask勉強会その1
PDF
NetBeans、FuelPHP と過ごしたこの 2 ヶ月
PDF
omoon.org の裏側 〜FuelPHP の task 活用例〜
PDF
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
PDF
CakePHP 1 to 2 Migration tips 100
PDF
JobSchedulerでCD(継続的デリバリ)
Ec cube開発合宿 プラグインセミナー
実"戦"CakePHP Plugin
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
.htaccessによるリダイレクト徹底解説
はじめての FuelPHP
CodeIgniter入門
今、最も勢いのあるWebフレームワーク「fuel php」
EC-CUBEプラグイン講義
Vue入門
NetBeansではじめる FuelPHP
最近、僕がハマったFuelPHPの紹介
FuelPHPで3種のprofilerを使ってみた
FuelPHP - フレームワーク4本勝負 @PHPカンファレンス関西2014
Ansible2.9 ネットワーク対応のアップデート #ansiblejp
Flask勉強会その1
NetBeans、FuelPHP と過ごしたこの 2 ヶ月
omoon.org の裏側 〜FuelPHP の task 活用例〜
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
CakePHP 1 to 2 Migration tips 100
JobSchedulerでCD(継続的デリバリ)
Ad

Viewers also liked (8)

PDF
20091030cakephphandson 02
PDF
Engine Yard Cloud
PDF
20121225 php
PPT
Cake Php キャッシュのやり方
PDF
20120507 zendform
PDF
20090905 Cake Php
PDF
【公式資料】第2回クラウド・マーケティング研究会オープニングセッション
PPT
Apresentação mahara
20091030cakephphandson 02
Engine Yard Cloud
20121225 php
Cake Php キャッシュのやり方
20120507 zendform
20090905 Cake Php
【公式資料】第2回クラウド・マーケティング研究会オープニングセッション
Apresentação mahara
Ad

Similar to 20091030cakephphandson 01 (20)

PDF
Cakephp
ODP
Ci tutorial
KEY
8分で分かる最近のCakePHP
PDF
WTM53 phpフレームワーク いまさらcodeigniter
PDF
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
KEY
10分で分かる最近のCakePHP
PPT
Cakephp tokyo5
PDF
PHPフレームワーク入門
PPT
Cake Php開発事例
PDF
第2回webデザイナー向けcake php勉強会
PDF
はじめてのCodeIgniter
PPT
CakePHPで開発する時に統一しておきたいコーディング内容(080316)
PDF
Weeklycms20120218
PDF
Lithium Labo #1
PDF
Angular js meets cakephp at cloud on the beach 2014 前夜祭
PDF
20120307 CakePHP Study in Tokyo
ODP
CakePHP Kansai 2008-12-12
PPT
Cakephpstudy5 hacks jp
PDF
CakePHP2 Loading (Japanese)
PDF
WordPressで提供するWeb API
Cakephp
Ci tutorial
8分で分かる最近のCakePHP
WTM53 phpフレームワーク いまさらcodeigniter
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
10分で分かる最近のCakePHP
Cakephp tokyo5
PHPフレームワーク入門
Cake Php開発事例
第2回webデザイナー向けcake php勉強会
はじめてのCodeIgniter
CakePHPで開発する時に統一しておきたいコーディング内容(080316)
Weeklycms20120218
Lithium Labo #1
Angular js meets cakephp at cloud on the beach 2014 前夜祭
20120307 CakePHP Study in Tokyo
CakePHP Kansai 2008-12-12
Cakephpstudy5 hacks jp
CakePHP2 Loading (Japanese)
WordPressで提供するWeb API

More from Yusuke Ando (20)

PDF
ダイナミック広告の改善と拡大
PDF
DevOpsを実現するChef活用テクニック
PDF
DevOpsを実現する為のChef実践テクニック Chef12対応版
PDF
Testing your app with Selenium on Travis CI
PDF
Travis CIで実現するPHPアプリの自動テスト
PDF
Shimokita.Unity Detonatorで爆発
PDF
Shimokita.Unity RigidbodyとColliderで衝突
PDF
Webプログラマの為のUnity入門
PDF
ゴールデンウィークに最適な学習コンテンツ
PDF
Travis CIですぐに始める継続的インテグレーション
PDF
ブログやサイトのJekyllへの移行
PDF
PHPとTravis CIでブラウザテスト
PDF
Shimokita.Unity パリの街をユニティちゃんが駆ける
PDF
Dev opschef
PDF
Paa s and oss
PDF
New relic
PDF
Engine Yardで作る NetCommons3のクラウド環境
PDF
最近のCandyCane - PHP版Redmineでタスク管理を始めよう
PDF
PHPの教室「foreachを極める」
PDF
90分間濃縮 PHPエラーの教室
ダイナミック広告の改善と拡大
DevOpsを実現するChef活用テクニック
DevOpsを実現する為のChef実践テクニック Chef12対応版
Testing your app with Selenium on Travis CI
Travis CIで実現するPHPアプリの自動テスト
Shimokita.Unity Detonatorで爆発
Shimokita.Unity RigidbodyとColliderで衝突
Webプログラマの為のUnity入門
ゴールデンウィークに最適な学習コンテンツ
Travis CIですぐに始める継続的インテグレーション
ブログやサイトのJekyllへの移行
PHPとTravis CIでブラウザテスト
Shimokita.Unity パリの街をユニティちゃんが駆ける
Dev opschef
Paa s and oss
New relic
Engine Yardで作る NetCommons3のクラウド環境
最近のCandyCane - PHP版Redmineでタスク管理を始めよう
PHPの教室「foreachを極める」
90分間濃縮 PHPエラーの教室

20091030cakephphandson 01