狠狠撸

狠狠撸Share a Scribd company logo
PHP	
 ?フレームワーク入門	

       Dec.	
 ?7,	
 ?2011	
 ?
    第1回 岡山PHP勉強会	



               sho	
 ?<sho@codeigniter.jp>
本発表の主な対象者	

	
 ?
       Web	
 ?アプリをつくったことがある	
 ?
	
 ?
                 &&	
 ?
	
 ?
       フレームワークを使ったことがない	
 ?


                                  2
?
	
 ?
	
 ?

       フレームワークってなに?	
 ?



                          3
その前に…	

	
 ?
	
 ?
	
 ?

       こんな経験はありませんか?	
 ?



                           4
いつも同じようなコード書いてね?	

?? 煩雑な入力検査	
 ?

   if	
 ?(empty($_POST[‘name’]))	
 ?
               	
 ?$error[]	
 ?=	
 ?‘お名前が未入力です。’;	
 ?
   	
 ?
   if	
 ?(!preg_match(‘/^[a-?‐z0-?‐9-?‐_.]@[a-?‐z0-?‐9-?‐.]$/i’,$_POST[‘mail’]))	
 ?
                 	
 ?$error[]	
 ?=	
 ?‘E-?‐Mail	
 ?を正しく入力してください。’;	
 ?
   	
 ?
   if	
 ?(strlen($_POST[‘tel’])	
 ?>	
 ?13)	
 ?
                 	
 ?$error[]	
 ?=	
 ?‘電話番号は13文字以内で入力してください。’;	
 ?




                                                                                           5
いつも同じようなコード書いてね?	

?? HTML	
 ?のエスケープ	
 ?
  ようこそ、<?php	
 ?echo(htmlspecialchars($_POST[‘name’]));	
 ??>	
 ?さん!	
 ?



?? SQL	
 ?のエスケープ	
 ?
  $sql	
 ?=	
 ?‘SELECT	
 ?*	
 ?FROM	
 ?users	
 ?’;	
 ?
  $sql	
 ?.=	
 ?‘WHERE	
 ?NAME	
 ?LIKE	
 ?%‘	
 ?.	
 ?mysql_real_escape_string($_GET[‘key’])	
 ?.	
 ?‘%	
 ?’;	
 ?
  $sql	
 ?.=	
 ?‘AND	
 ?age	
 ?>=	
 ?’	
 ?.	
 ?sprin1(‘%d’,	
 ?$_GET[‘year’]);	
 ?




                                                                                                                   6
いつも同じようなコード書いてね?	

?? よくある機能	
 ?
  –? ページ送り	
 ?
  –? ユーザ認証	
 ?
  –? 設定値の取得	
 ?
  –? ファイルアップロード	
 ?
  –? メール送信	
 ?

?? セッション管理	
 ?
?? データベースアクセス	
 ?etc.	
 ?

                            7
だれだよこんなコード書いたの…	

?? ロジックとデザインがごちゃまぜ	
 ?

<html><body>	
 ?
<table>	
 ?
<?php	
 ?
require_once('conf.inc.php');	
 ?
$db	
 ?=	
 ?DB::connect('mysql://'.DB_USER.':'.DB_PASS.'@'.DB_HOST.'/'.DB_NAME);	
 ?
$so	
 ?=	
 ?$db-?‐>prepare(’SELECT	
 ?*	
 ?FROM	
 ?users	
 ?ORDER	
 ?BY	
 ?user_id	
 ?ASC;');	
 ?
$rs	
 ?=	
 ?$db-?‐>execute($so);	
 ?
while	
 ?($row	
 ?=	
 ?$rs-?‐>fetchRow(DB_FETCHMODE_ASSOC))	
 ?{	
 ?
?>	
 ?
	
 ?	
 ?	
 ?	
 ?<tr>	
 ?
	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?<th><?=	
 ?$row[‘id’]	
 ??></th><td><?=	
 ?htmlspecialchars($row[‘name’])	
 ??></td>	
 ?
	
 ?	
 ?	
 ?	
 ?</tr>	
 ?
<?php	
 ?}	
 ??>	
 ?
</table>	
 ?
</body></html>	
 ?
                                                                                                                           8
だれだよこんなコード書いたの…	

?? ルールが統一されていない	
 ?
 –? 命名規則	
 ?
 –? ディレクトリ構成	
 –? インデント	




                      9
サーバを移したら動かなくなった	

?? よくある原因	
 ?(PHP):	
 ?
   –? バージョンの違い	
 ?
   –? 設定値の違い	
 ?
   –? 外部ライブラリの不足	
 ?




                          10
セキュリティが不安……	

?? SQL	
 ?Injecuon	
 ?
?? XSS	
 ?(Cross	
 ?Site	
 ?Scripung)	
 ?
?? セッションハイジャック	
 ?
?? ディレクトリトラバーサル	
 ?
        	
 ?:	
 ?




                                            11
?
	
 ?
	
 ?

       心当たりがありましたか?	
 ?



                          12
?
	
 ?
	
 ?

       フレームワークで解決!	
 ?
            (するかも)	
 ?



                         13
“フレームワーク”	

?? framework	
 ?【名】	
 ?骨組み、枠組み、骨格	
 ?
?? なにかの土台となるもの	
 ?




                                        14
?
	
 ?
	
 ?

       フレームワークの主な役割	
 ?



                          15
標準的な機能の提供	

?? ライブラリ	
 ?
  –? ページ送り,ユーザ認証,ファイルアップロード,メール送
     信	
 ?	
 ?etc.	
 ?

?? ヘルパ関数	
 ?
  –? 例)	
 ?CakePHP	
 ?の pr():	
 ?
      print_r()	
 ?の結果を	
 ?<pre>	
 ?</pre>	
 ?で囲って出力	
 ?


                echo(‘<pre>’);	
 ?
                print_r($hoge);	
 ?           pr($hoge);	
 ?
                echo(‘</pre>’);	
 ?


                                                               16
MVC	
 ?モデルの実現	

?? ソフトウェアを次の	
 ?3	
 ?つの構造に分割する手法	
 ?
  –? Model	
 ?
      ?? データの読み書きを行なう	
 ?

  –? View	
 ?
      ?? データを表示する	
 ?

  –? Controller	
 ?
      ?? Model	
 ?と View	
 ?を制御し,ユーザの入力に応答する	



                                                 17
MVC	
 ?モデル	

?? イメージ	

                       Controller	



              View	
                      Model	

     HTML	



                                 File	
      データベース	


                                                        18
MVC	
 ?モデルのメリット	

     ?? 独立性を確保	
 ?
            –? 機能ごとの役割が明確に	
 ?

     ?? 依存性の抑制	
 ?
            –? 変更の影響を受けにくく	
 ?
            –? 部品の再利用性が向上	
 ?

     ?? 保守性の向上	
 ?
            –? デザインとビジネスロジックの切り分け	
 ?

参考:	
 ?hop://www.atmarkit.co.jp/zava/javafaq/j2ee/j2e07.html	
   19
OR	
 ?マッピング	

?? Object-?‐Relauonal	
 ?Mapping	
 ?
?? DB	
 ?をオブジェクトとして扱う手法	
 ?
               id	
 name	
   mail	
               1	
 前田 敦子	
 a-?‐maeda@example.com	
                                           Members_model	
 ?	
 ?
                                                                                                Object	
               2	
 大島 優子	
 yohshima@example.net	
               3	
 北原 里英	
 kitarie@example.co.jp	

                                                                      $members_model	
 ?
                              Member	
 ?Object	
 ?                         -?‐>get_row(3)	
                              (	
 ?
                              	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?[id]	
 ?=>	
 ?3	
 ?
                              	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?[name]	
 ?=>	
 ?北原 里英	
 ?
                              	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?[mail]	
 ?=>	
 ?kitarie@example.co.jp	
 ?
                              )	
                                                                             20
ルールの制定	

?? 命名規則	
 ?
  –? 変数名,テーブル名	
 ?

?? ディレクトリ構成	
 ?

?? コーディングスタイル	
 ?




                     21
メリットのまとめ	

?? 開発工数の短縮	
 ?
       –? 同じようなコードを繰り返し書かなくて良い	
 ?
	
 ?
?? 品質の均一化	
 ?
?? 保守性の向上	
 ?
?? セキュリティの向上	
 ?
       –? ルールが統一されるため	
 ?


                                     22
フレームワークのデメリット	

?? 学習コストがかかる	
 ?
?? どれが良いかわからない	
 ?
  –? CakePHP	
 ?
  –? Symfony	
 ?
  –? Zend	
 ?Framework	
 ?
  –? CodeIgniter	
 ?
      ?? Kohana,	
 ?FuelPHP,	
 ?……	
 ?


                                         23
フレームワークの選定基準	

?? 実用性	
 ?
  –? 安定性	
 ?
  –? 機能,対応バージョン	
 ?
?? 開発の継続性	
 ?
?? ライセンス	
 ?
?? 情報の入手しやすさ	
 ?


                      24
?
	
 ?
	
 ?

       CodeIgniter	
 ?の紹介	
 ?



                                25
CodeIgniter	
 ?とは	

?? 	
 ?[kóud ig?nít?er]	
 ?
?? ignite:	
 ?[自動]	
 ?発火する	
 ?	
 ?[他動]	
 ?点火する	
 ?
       	
 ?
?? 無料,オープンソース (3.0	
 ?から	
 ?OSL)	
 ?
?? 2006年 2月に登場	
 ?
?? EllisLab,	
 ?Inc.	
 ?が開発	
 ?
	
 ?
*	
 ?CodeIgniter	
 ?and	
 ?its	
 ?logo	
 ?are	
 ?property	
 ?of	
 ?ElisLab	
 ?Inc.	
 ?


                                                                                         26
「高速」 「軽量」 「低い学習コスト」	

?? 高速	
 ?
   –? 他のフレームワークと比較しても圧倒的	
 ?
   –?  	
 ?
       CodeIgniter	
 ? ベンチマーク	
   検索	

?? 軽量	
 ?
   –? ソースの容量は約 1.2MByte	
 ?

?? 低い学習コスト	
 ?
   –? 規約,覚えることが少ない	
 ?

                                         27
とっつきやすい	

?? 日本語のユーザガイドが完備	
 ?

?? コマンドライン操作が不要	
 ?

?? レンタルサーバでも幅広く動作	
 ?
 –? System	
 ?は原則,外部ライブラリを不使用	
 ?
 –? PHP	
 ?のバージョンや設定の違いを (ある程度)	
 ?吸収	
 ?

?? ほとんど設定が不要	


                                            28
Apple	
 ?も使ってる?	
 ?




                                                                      CodeIgniter	




hop://jobs.apple.com/index.ajs?method=mExternal.showJob&RID=92938	
                   29
CodeIgniter	
 ?の	
 ?URL	

      hop://example.jp/hoge/index.php/	
 ?fuga	
 ?/	
 ?piyo	
 ?/	
 ?foo	
 ?
                                                                           機能名	
 操作名	
 引数	




      	
 ?
                                                                                                         Controller	
      	
 ?	
 ?class	
 ?Fuga	
 ?extends	
 ?CI_Controller	
 ?{	
 ?
      	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?(中略)	
 ?
      	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?funcuon	
 ?piyo($arg1,	
 ?$arg2	
 ?=	
 ?‘test’)	
 ?{	
 ?
      	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?…	
 ?
      	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?}	
 ?
      	
 ?	
 ?}	
                                                             	
                                                                                                                        30
?
	
 ?
	
 ?

       CodeIgniter	
 ?の機能の一例	
 ?



                                   31
フォーム検証	
 ?

?? 検証ルールをセット	
 ?
   –? $this-?‐>form_validauon-?‐>set_rules(	
 ?
       	
 ?    	
 ?‘name	
 ?属性の値’,	
 ?	
 ?
       	
 ?    	
 ?‘表示名’,	
 ?	
 ?
       	
 ?    	
 ?‘検証ルール’	
 ?
      );	
 ?


?? 検証	
 ?                                    成功:	
 ?TRUE	
 ?/	
 ?失敗:	
 ?FALSE	

   –? $this-?‐>form_validauon-?‐>run()	
 ?

                                                                                  32
フォーム検証	
 ?

?? 検証ルールの一例	
 ?
   ルール名	
            用途	
   required	
        なにか入力されているか	
   matches[hoge]	
   他のフィールドと一致するか	
 ?
                     (例:	
 ?E-?‐mailの確認入力)	
   max_length[n]	
   文字数が n	
 ?以内か	
   alpha_numeric	
   半角英数字か	
   valid_email	
     E-?‐mail	
 ?アドレスとして正しい書式か	


 –? 複数指定するときはパイプ |	
 ?で区切る	
 ?
 –? 自前のルールを定義することも可能	
 ?
                                                   33
フォーム検証	
 ?

?? 実際のコードの例:	
 ?
    	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?:	
 ?                検証ルールをセット	
    	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?$this-?‐>_set_validauon();	
 ?
    	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?if	
 ?($this-?‐>form_valida:on-?‐>run()	
 ?!==	
 ?TRUE)	
 ?{	
 ?
    	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?//	
 ?検証失敗	
 ?
    	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?}	
 ?else	
 ?{	
 ?
                                                                                   検証実行	
    	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?//	
 ?検証成功	
 ?
    	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?}	
 ?
    }	
 ?

                                                                                                            検証ルール	
   funcuon	
 ?_set_valida:on()	
 ?{	
 ?
   	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?$this-?‐>form_validauon-?‐>set_rules('mail',	
 ?'E-?‐Mail',	
 ?	
 ?
   	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?'required|valid_email|max_length[100]');	
 ?
   	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?$this-?‐>form_validauon-?‐>set_rules('birth',	
 ?'生年月日',	
 ?	
 ?
   	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?'required|is_natural|exact_length[8]');	
 ?
   }	
 ?	
 ?	
 ?	
 ?	
 ?
                                                                                                                      34
フォーム検証	
 ?

?? ユーザにエラーを表示 (検証失敗時)	
 ?
       –? set_value():	
 ?入力値	
 ?
       –? form_error():	
 ?エラーの内容	
 ?
	
 ?
?? 例)	
 ?
          <tr>	
 ?
          	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?<th>E-?‐Mail</th>	
 ?
          	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?<td><input	
 ?type="text"	
 ?name="mail"	
 ?size="30"	
 ?
          	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?value="<?php	
 ?echo	
 ?set_value('mail');	
 ??>"	
 ?/>	
 ?
          	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?<?php	
 ?echo	
 ?form_error('mail');	
 ??></td>	
 ?
          </tr>	
 ?
          	
 ?
                                                                                                                                                                        35
データベースアクセス	

?? 対応 DBMS	
 ?
   –? MySQL,MS	
 ?SQL,Postgres,Oracle,SQLite	
 ?	
 ?etc.	
 ?

?? Acuve	
 ?Record	
 ?
   –? 取得や挿入,更新を最小限のコードで	
 ?
   –? 各 DBMS	
 ?間の SQL	
 ?構文の違いを吸収	
 ?
   –? 値を自動的にエスケープ	
 ?
※	
 ?もちろん自分で SQL	
 ?文を書くことも可能	
 ?


                                                               36
Acuve	
 ?Record	
 ?の使用法 (の一部)	

?? 取得:	
 ?get()	
 ?
    –? $query	
 ?=	
 ?$this-?‐>db-?‐>get(‘mytable’,	
 ?10,	
 ?20);	
 ?
    	
 ?
           SELECT	
 ?*	
 ?FROM	
 ?`mytable`	
 ?	
 ?LIMIT	
 ?20,	
 ?10;	
 ?
    	
 ?
?? 条件を指定:	
 ?where()	
 ?
    –? $this-?‐>db-?‐>where(array(‘id’	
 ?=>	
 ?123));	
 ?
       $query	
 ?=	
 ?$this-?‐>db-?‐>get(‘mytable’);	
 ?

           SELECT	
 ?*	
 ?FROM	
 ?`mytable`	
 ?WHERE	
 ?id=123;	
 ?
                                                                             37
Acuve	
 ?Record	
 ?の使用法 (の一部)	

?? 挿入:	
 ?insert()	
 ?
    –? $data	
 ?=	
 ?array(	
 ?
       	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?‘7tle’	
 ?=>	
 ?‘My	
 ?7tle’	
 ?,	
 ?
       	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?‘name’	
 ?=>	
 ?‘My	
 ?Name’	
 ?,	
 ?
       	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?‘date’	
 ?=>	
 ?‘My	
 ?date‘	
 ?
       );	
 ?
       $this-?‐>db-?‐>insert(’mytable’,	
 ?$data);	
 ?

           INSERT	
 ?INTO	
 ?`mytable`	
 ?	
 ?(`7tle`,	
 ?`name`,	
 ?`date`)	
 ?
           	
 ?	
 ?	
 ?	
 ?VALUES	
 ?('My	
 ?Title',	
 ?'My	
 ?Name',	
 ?'My	
 ?Date');	
 ?


                                                                                              38
?
	
 ?
	
 ?

       アプリを作ってみよう	
 ?



                        39
例題アプリケーション	

?? 岡山の勉強会情報サイト 「おかやまべん。」	
 ?




                               40
開発の流れ	
1.? 機能を考える	
 ?

2.? どんなデータを扱うかを考える	
 ?

3.? テーブル構成を考える	
 ?

4.? Controller,	
 ?View,	
 ?Model	
 ?の作成	
 ?




                                               41
実装する機能	

?? コミュニティ情報	
 ?
?? イベント情報	
 ?
  –? 一覧表示,詳細表示	
 ?
  –? 登録,編集,削除	
 ?




                     42
テーブル構成	

?? コミュニティ情報	
 ?(communiues)	
 ?
       名前	
            型	
         用途	
       id	
            int	
       コミュニティ	
 ?ID	
       name	
          varchar	
   コミュニティ名	
       comment	
       text	
      コメント	

?? イベント情報	
 ?(events)	
 ?
       名前	
            型	
         用途	
       id	
            int	
       イベント	
 ?ID	
       community_id	
 int	
        コミュニティ	
 ?ID	
       name	
          char	
      イベント 名	
       comment	
       text	
      コメント	
                                                    43
Model	
 ?の作成	

?? テーブルごとに	
 ?1	
 ?つ	
 ?
?? models/	
 ?
   –? communiues_model.php	
 ?.……	
 ?コミュニティ情報 	
 ?
   –? events_model.php	
 ?………………	
 ?イベント情報	
 ?




                                                     44
Model	
 ?の作成	

?? 例)	
 ?applicauon/models/	
 ?events_model.php	
 ?
	
 ?    Class	
 ?Events_model	
 ?extends	
 ?CI_Model	
 ?{	
 ?
        	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?(中略)	
 ?
	
 ?    	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?funcuon	
 ?get_row($id)	
 ?{	
 ?
        	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?$this-?‐>db-?‐>where(’id',	
 ?$id);	
 ?         クエリを組立	
	
 ?    	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?$query	
 ?=	
 ?$this-?‐>db-?‐>get(’event');	
 ?
        	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?$result	
 ?=	
 ?$query-?‐>result();	
 ?
	
 ?    	
 ?
        	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?return	
 ?$result[0];	
 ?          実行結果を取得	
	
 ?    	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?}	
 ?
	
 ?    }	
 ?

※	
 ?Model 名とテーブル名は同じにするのがおすすめ	
 ?
※	
 ?実際には引数や結果の検査,例外処理が必要	
 ?

                                                                                                                                   45
View	
 ?の作成	

?? 基本は	
 ?HTML	
 ?
?? 画面	
 ?(ページ)	
 ?ごとに	
 ?1	
 ?つ	
 ?
?? 共通部分はブロック化して	
 ?include	
 ?
?? テンプレートパーサの利用	
 ?
   –? 変数の出力	
 ?
   –? 繰り返し制御	
 ?



                                      46
Controller	
 ?の作成	

?? 機能ごとに	
 ?1	
 ?つのコントローラ	
 ?
?? 操作ごとに	
 ?1	
 ?つのアクション	
 ?	
 ?
?? controllers/	
 ?
   –? community.php	
 ?…	
 ?コミュニティ情報	
 ?
       ?? アクション:	
 ?	
 ?index(),	
 ?	
 ?detail(),	
 ?	
 ?add(),	
 ?	
 ?edit(),	
 ?	
 ?delete(),	
 ?	
 ?…	
 ?
   –? event.php	
 ?………….	
 ?イベント情報	
 ?
       ?? アクション:	
 ?	
 ?index(),	
 ?	
 ?detail(),	
 ?	
 ?add(),	
 ?	
 ?edit(),	
 ?	
 ?delete(),	
 ?	
 ?…	
 ?


                                                                                                               47
Controller	
 ?から Model,	
 ?View	
 ?をロード	

?? 例)	
 ?applicauon/controllers/	
 ?event.php	
 ?

             Class	
 ?Event	
 ?extends	
 ?CI_Controller	
 ?{	
 ?
             	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?:	
 ?                                                    Model	
 ?をロード	
             	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?funcuon	
 ?detail($id)	
 ?{	
 ?
       1     	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?$this-?‐>load-?‐>model(‘Event_model’);	
 ?
                                                                                                                                                データを取得	
      	
 ?




             	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?$data[‘event’]	
 ?=	
 ?	
 ?                                                    1
      操      	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?$this-?‐>Event_model-?‐>get_row($id);	
 ?




                                                                                                                                                           	
 ?
      作      	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?$this-?‐>load-?‐>view(’detail',	
 ?$data);	
 ?
                                                                                                                                                           機
      	




             	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?}	
 ?                                                                                                             能
             	
 ?                                                                                                         View	
 ?に渡す	




                                                                                                                                                           	
       1
             	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?funcuon	
 ?add()	
 ?{	
 ?
      	
 ?




             	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?	
 ?:	
 ?
      操
      作
      	




                                                                                                                                                                  48
?
	
 ?
	
 ?

       実 演	
 ?



                 49
?
	
 ?
	
 ?

       おわり	
 ?



                 50

More Related Content

笔贬笔フレームワーク入门

  • 1. PHP ?フレームワーク入門 Dec. ?7, ?2011 ? 第1回 岡山PHP勉強会 sho ?<sho@codeigniter.jp>
  • 2. 本発表の主な対象者 ? Web ?アプリをつくったことがある ? ? && ? ? フレームワークを使ったことがない ? 2
  • 3. ? ? ? フレームワークってなに? ? 3
  • 4. その前に… ? ? ? こんな経験はありませんか? ? 4
  • 5. いつも同じようなコード書いてね? ?? 煩雑な入力検査 ? if ?(empty($_POST[‘name’])) ? ?$error[] ?= ?‘お名前が未入力です。’; ? ? if ?(!preg_match(‘/^[a-?‐z0-?‐9-?‐_.]@[a-?‐z0-?‐9-?‐.]$/i’,$_POST[‘mail’])) ? ?$error[] ?= ?‘E-?‐Mail ?を正しく入力してください。’; ? ? if ?(strlen($_POST[‘tel’]) ?> ?13) ? ?$error[] ?= ?‘電話番号は13文字以内で入力してください。’; ? 5
  • 6. いつも同じようなコード書いてね? ?? HTML ?のエスケープ ? ようこそ、<?php ?echo(htmlspecialchars($_POST[‘name’])); ??> ?さん! ? ?? SQL ?のエスケープ ? $sql ?= ?‘SELECT ?* ?FROM ?users ?’; ? $sql ?.= ?‘WHERE ?NAME ?LIKE ?%‘ ?. ?mysql_real_escape_string($_GET[‘key’]) ?. ?‘% ?’; ? $sql ?.= ?‘AND ?age ?>= ?’ ?. ?sprin1(‘%d’, ?$_GET[‘year’]); ? 6
  • 7. いつも同じようなコード書いてね? ?? よくある機能 ? –? ページ送り ? –? ユーザ認証 ? –? 設定値の取得 ? –? ファイルアップロード ? –? メール送信 ? ?? セッション管理 ? ?? データベースアクセス ?etc. ? 7
  • 8. だれだよこんなコード書いたの… ?? ロジックとデザインがごちゃまぜ ? <html><body> ? <table> ? <?php ? require_once('conf.inc.php'); ? $db ?= ?DB::connect('mysql://'.DB_USER.':'.DB_PASS.'@'.DB_HOST.'/'.DB_NAME); ? $so ?= ?$db-?‐>prepare(’SELECT ?* ?FROM ?users ?ORDER ?BY ?user_id ?ASC;'); ? $rs ?= ?$db-?‐>execute($so); ? while ?($row ?= ?$rs-?‐>fetchRow(DB_FETCHMODE_ASSOC)) ?{ ? ?> ? ? ? ? ?<tr> ? ? ? ? ? ? ? ? ?<th><?= ?$row[‘id’] ??></th><td><?= ?htmlspecialchars($row[‘name’]) ??></td> ? ? ? ? ?</tr> ? <?php ?} ??> ? </table> ? </body></html> ? 8
  • 9. だれだよこんなコード書いたの… ?? ルールが統一されていない ? –? 命名規則 ? –? ディレクトリ構成 –? インデント 9
  • 10. サーバを移したら動かなくなった ?? よくある原因 ?(PHP): ? –? バージョンの違い ? –? 設定値の違い ? –? 外部ライブラリの不足 ? 10
  • 11. セキュリティが不安…… ?? SQL ?Injecuon ? ?? XSS ?(Cross ?Site ?Scripung) ? ?? セッションハイジャック ? ?? ディレクトリトラバーサル ? ?: ? 11
  • 12. ? ? ? 心当たりがありましたか? ? 12
  • 13. ? ? ? フレームワークで解決! ? (するかも) ? 13
  • 14. “フレームワーク” ?? framework ?【名】 ?骨組み、枠組み、骨格 ? ?? なにかの土台となるもの ? 14
  • 15. ? ? ? フレームワークの主な役割 ? 15
  • 16. 標準的な機能の提供 ?? ライブラリ ? –? ページ送り,ユーザ認証,ファイルアップロード,メール送 信 ? ?etc. ? ?? ヘルパ関数 ? –? 例) ?CakePHP ?の pr(): ? print_r() ?の結果を ?<pre> ?</pre> ?で囲って出力 ? echo(‘<pre>’); ? print_r($hoge); ? pr($hoge); ? echo(‘</pre>’); ? 16
  • 17. MVC ?モデルの実現 ?? ソフトウェアを次の ?3 ?つの構造に分割する手法 ? –? Model ? ?? データの読み書きを行なう ? –? View ? ?? データを表示する ? –? Controller ? ?? Model ?と View ?を制御し,ユーザの入力に応答する 17
  • 18. MVC ?モデル ?? イメージ Controller View Model HTML File データベース 18
  • 19. MVC ?モデルのメリット ?? 独立性を確保 ? –? 機能ごとの役割が明確に ? ?? 依存性の抑制 ? –? 変更の影響を受けにくく ? –? 部品の再利用性が向上 ? ?? 保守性の向上 ? –? デザインとビジネスロジックの切り分け ? 参考: ?hop://www.atmarkit.co.jp/zava/javafaq/j2ee/j2e07.html 19
  • 20. OR ?マッピング ?? Object-?‐Relauonal ?Mapping ? ?? DB ?をオブジェクトとして扱う手法 ? id name mail 1 前田 敦子 a-?‐maeda@example.com Members_model ? ? Object 2 大島 優子 yohshima@example.net 3 北原 里英 kitarie@example.co.jp $members_model ? Member ?Object ? -?‐>get_row(3) ( ? ? ? ? ? ? ? ? ?[id] ?=> ?3 ? ? ? ? ? ? ? ? ?[name] ?=> ?北原 里英 ? ? ? ? ? ? ? ? ?[mail] ?=> ?kitarie@example.co.jp ? ) 20
  • 21. ルールの制定 ?? 命名規則 ? –? 変数名,テーブル名 ? ?? ディレクトリ構成 ? ?? コーディングスタイル ? 21
  • 22. メリットのまとめ ?? 開発工数の短縮 ? –? 同じようなコードを繰り返し書かなくて良い ? ? ?? 品質の均一化 ? ?? 保守性の向上 ? ?? セキュリティの向上 ? –? ルールが統一されるため ? 22
  • 23. フレームワークのデメリット ?? 学習コストがかかる ? ?? どれが良いかわからない ? –? CakePHP ? –? Symfony ? –? Zend ?Framework ? –? CodeIgniter ? ?? Kohana, ?FuelPHP, ?…… ? 23
  • 24. フレームワークの選定基準 ?? 実用性 ? –? 安定性 ? –? 機能,対応バージョン ? ?? 開発の継続性 ? ?? ライセンス ? ?? 情報の入手しやすさ ? 24
  • 25. ? ? ? CodeIgniter ?の紹介 ? 25
  • 26. CodeIgniter ?とは ?? ?[kóud ig?nít?er] ? ?? ignite: ?[自動] ?発火する ? ?[他動] ?点火する ? ? ?? 無料,オープンソース (3.0 ?から ?OSL) ? ?? 2006年 2月に登場 ? ?? EllisLab, ?Inc. ?が開発 ? ? * ?CodeIgniter ?and ?its ?logo ?are ?property ?of ?ElisLab ?Inc. ? 26
  • 27. 「高速」 「軽量」 「低い学習コスト」 ?? 高速 ? –? 他のフレームワークと比較しても圧倒的 ? –?   ? CodeIgniter ? ベンチマーク 検索 ?? 軽量 ? –? ソースの容量は約 1.2MByte ? ?? 低い学習コスト ? –? 規約,覚えることが少ない ? 27
  • 28. とっつきやすい ?? 日本語のユーザガイドが完備 ? ?? コマンドライン操作が不要 ? ?? レンタルサーバでも幅広く動作 ? –? System ?は原則,外部ライブラリを不使用 ? –? PHP ?のバージョンや設定の違いを (ある程度) ?吸収 ? ?? ほとんど設定が不要 28
  • 29. Apple ?も使ってる? ? CodeIgniter hop://jobs.apple.com/index.ajs?method=mExternal.showJob&RID=92938 29
  • 30. CodeIgniter ?の ?URL hop://example.jp/hoge/index.php/ ?fuga ?/ ?piyo ?/ ?foo ? 機能名 操作名 引数 ? Controller ? ?class ?Fuga ?extends ?CI_Controller ?{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(中略) ? ? ? ? ? ? ? ? ? ? ?funcuon ?piyo($arg1, ?$arg2 ?= ?‘test’) ?{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?… ? ? ? ? ? ? ? ? ? ? ?} ? ? ?} 30
  • 31. ? ? ? CodeIgniter ?の機能の一例 ? 31
  • 32. フォーム検証 ? ?? 検証ルールをセット ? –? $this-?‐>form_validauon-?‐>set_rules( ? ? ?‘name ?属性の値’, ? ? ? ?‘表示名’, ? ? ? ?‘検証ルール’ ? ); ? ?? 検証 ? 成功: ?TRUE ?/ ?失敗: ?FALSE –? $this-?‐>form_validauon-?‐>run() ? 32
  • 33. フォーム検証 ? ?? 検証ルールの一例 ? ルール名 用途 required なにか入力されているか matches[hoge] 他のフィールドと一致するか ? (例: ?E-?‐mailの確認入力) max_length[n] 文字数が n ?以内か alpha_numeric 半角英数字か valid_email E-?‐mail ?アドレスとして正しい書式か –? 複数指定するときはパイプ | ?で区切る ? –? 自前のルールを定義することも可能 ? 33
  • 34. フォーム検証 ? ?? 実際のコードの例: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?: ? 検証ルールをセット ? ? ? ? ? ? ? ?$this-?‐>_set_validauon(); ? ? ? ? ? ? ? ? ?if ?($this-?‐>form_valida:on-?‐>run() ?!== ?TRUE) ?{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// ?検証失敗 ? ? ? ? ? ? ? ? ?} ?else ?{ ? 検証実行 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// ?検証成功 ? ? ? ? ? ? ? ? ?} ? } ? 検証ルール funcuon ?_set_valida:on() ?{ ? ? ? ? ? ? ? ? ?$this-?‐>form_validauon-?‐>set_rules('mail', ?'E-?‐Mail', ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'required|valid_email|max_length[100]'); ? ? ? ? ? ? ? ? ?$this-?‐>form_validauon-?‐>set_rules('birth', ?'生年月日', ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'required|is_natural|exact_length[8]'); ? } ? ? ? ? ? 34
  • 35. フォーム検証 ? ?? ユーザにエラーを表示 (検証失敗時) ? –? set_value(): ?入力値 ? –? form_error(): ?エラーの内容 ? ? ?? 例) ? <tr> ? ? ? ? ? ? ? ? ?<th>E-?‐Mail</th> ? ? ? ? ? ? ? ? ?<td><input ?type="text" ?name="mail" ?size="30" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?value="<?php ?echo ?set_value('mail'); ??>" ?/> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?<?php ?echo ?form_error('mail'); ??></td> ? </tr> ? ? 35
  • 36. データベースアクセス ?? 対応 DBMS ? –? MySQL,MS ?SQL,Postgres,Oracle,SQLite ? ?etc. ? ?? Acuve ?Record ? –? 取得や挿入,更新を最小限のコードで ? –? 各 DBMS ?間の SQL ?構文の違いを吸収 ? –? 値を自動的にエスケープ ? ※ ?もちろん自分で SQL ?文を書くことも可能 ? 36
  • 37. Acuve ?Record ?の使用法 (の一部) ?? 取得: ?get() ? –? $query ?= ?$this-?‐>db-?‐>get(‘mytable’, ?10, ?20); ? ? SELECT ?* ?FROM ?`mytable` ? ?LIMIT ?20, ?10; ? ? ?? 条件を指定: ?where() ? –? $this-?‐>db-?‐>where(array(‘id’ ?=> ?123)); ? $query ?= ?$this-?‐>db-?‐>get(‘mytable’); ? SELECT ?* ?FROM ?`mytable` ?WHERE ?id=123; ? 37
  • 38. Acuve ?Record ?の使用法 (の一部) ?? 挿入: ?insert() ? –? $data ?= ?array( ? ? ? ? ? ? ? ?‘7tle’ ?=> ?‘My ?7tle’ ?, ? ? ? ? ? ? ? ?‘name’ ?=> ?‘My ?Name’ ?, ? ? ? ? ? ? ? ?‘date’ ?=> ?‘My ?date‘ ? ); ? $this-?‐>db-?‐>insert(’mytable’, ?$data); ? INSERT ?INTO ?`mytable` ? ?(`7tle`, ?`name`, ?`date`) ? ? ? ? ?VALUES ?('My ?Title', ?'My ?Name', ?'My ?Date'); ? 38
  • 39. ? ? ? アプリを作ってみよう ? 39
  • 41. 開発の流れ 1.? 機能を考える ? 2.? どんなデータを扱うかを考える ? 3.? テーブル構成を考える ? 4.? Controller, ?View, ?Model ?の作成 ? 41
  • 42. 実装する機能 ?? コミュニティ情報 ? ?? イベント情報 ? –? 一覧表示,詳細表示 ? –? 登録,編集,削除 ? 42
  • 43. テーブル構成 ?? コミュニティ情報 ?(communiues) ? 名前 型 用途 id int コミュニティ ?ID name varchar コミュニティ名 comment text コメント ?? イベント情報 ?(events) ? 名前 型 用途 id int イベント ?ID community_id int コミュニティ ?ID name char イベント 名 comment text コメント 43
  • 44. Model ?の作成 ?? テーブルごとに ?1 ?つ ? ?? models/ ? –? communiues_model.php ?.…… ?コミュニティ情報 ? –? events_model.php ?……………… ?イベント情報 ? 44
  • 45. Model ?の作成 ?? 例) ?applicauon/models/ ?events_model.php ? ? Class ?Events_model ?extends ?CI_Model ?{ ? ? ? ? ? ? ? ? ? ? ? ? ?(中略) ? ? ? ? ? ? ? ? ? ?funcuon ?get_row($id) ?{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?$this-?‐>db-?‐>where(’id', ?$id); ? クエリを組立 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?$query ?= ?$this-?‐>db-?‐>get(’event'); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?$result ?= ?$query-?‐>result(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?return ?$result[0]; ? 実行結果を取得 ? ? ? ? ? ? ? ? ?} ? ? } ? ※ ?Model 名とテーブル名は同じにするのがおすすめ ? ※ ?実際には引数や結果の検査,例外処理が必要 ? 45
  • 46. View ?の作成 ?? 基本は ?HTML ? ?? 画面 ?(ページ) ?ごとに ?1 ?つ ? ?? 共通部分はブロック化して ?include ? ?? テンプレートパーサの利用 ? –? 変数の出力 ? –? 繰り返し制御 ? 46
  • 47. Controller ?の作成 ?? 機能ごとに ?1 ?つのコントローラ ? ?? 操作ごとに ?1 ?つのアクション ? ? ?? controllers/ ? –? community.php ?… ?コミュニティ情報 ? ?? アクション: ? ?index(), ? ?detail(), ? ?add(), ? ?edit(), ? ?delete(), ? ?… ? –? event.php ?…………. ?イベント情報 ? ?? アクション: ? ?index(), ? ?detail(), ? ?add(), ? ?edit(), ? ?delete(), ? ?… ? 47
  • 48. Controller ?から Model, ?View ?をロード ?? 例) ?applicauon/controllers/ ?event.php ? Class ?Event ?extends ?CI_Controller ?{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?: ? Model ?をロード ? ? ? ? ? ? ? ?funcuon ?detail($id) ?{ ? 1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?$this-?‐>load-?‐>model(‘Event_model’); ? データを取得 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?$data[‘event’] ?= ? ? 1 操 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?$this-?‐>Event_model-?‐>get_row($id); ? ? 作 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?$this-?‐>load-?‐>view(’detail', ?$data); ? 機 ? ? ? ? ? ? ?} ? 能 ? View ?に渡す 1 ? ? ? ? ? ? ? ?funcuon ?add() ?{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?: ? 操 作 48
  • 49. ? ? ? 実 演 ? 49
  • 50. ? ? ? おわり ? 50