Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
PHP	  フレームワーク入門	       Dec.	  7,	  2011	      第1回 岡山PHP勉強会	               sho	  <sho@codeigniter.jp>
本発表の主な対象者		         Web	  アプリをつくったことがある	  	                   &&	  	         フレームワークを使ったことがない	                            ...
 	  	         フレームワークってなに?	                            3
その前に…		  	  	         こんな経験はありませんか?	                             4
いつも同じようなコード書いてね?	•  煩雑な入力検査	     if	  (empty($_POST[‘name’]))	                 	  $error[]	  =	  ‘お名前が未入力です。’;	     	     ...
いつも同じようなコード書いてね?	•  HTML	  のエスケープ	    ようこそ、<?php	  echo(htmlspecialchars($_POST[‘name’]));	  ?>	  さん!	  •  SQL	  のエスケープ	  ...
いつも同じようなコード書いてね?	•  よくある機能	    –  ページ送り	    –  ユーザ認証	    –  設定値の取得	    –  ファイルアップロード	    –  メール送信	  •  セッション管理	  •  データベース...
だれだよこんなコード書いたの…	•  ロジックとデザインがごちゃまぜ	  <html><body>	  <table>	  <?php	  require_once(conf.inc.php);	  $db	  =	  DB::connect(...
だれだよこんなコード書いたの…	•  ルールが統一されていない	   –  命名規則	   –  ディレクトリ構成	 –  インデント	                      9
サーバを移したら動かなくなった	•  よくある原因	  (PHP):	     –  バージョンの違い	     –  設定値の違い	     –  外部ライブラリの不足	                            10
セキュリティが不安……	•  SQL	  Injecuon	  •  XSS	  (Cross	  Site	  Scripung)	  •  セッションハイジャック	  •  ディレクトリトラバーサル	          	  :	     ...
 	  	         心当たりがありましたか?	                            12
 	  	         フレームワークで解決!	              (するかも)	                           13
“フレームワーク”	•  framework	  【名】	  骨組み、枠組み、骨格	  •  なにかの土台となるもの	                                          14
 	  	         フレームワークの主な役割	                            15
標準的な機能の提供	•  ライブラリ	    –  ページ送り,ユーザ認証,ファイルアップロード,メール送     信	  	  etc.	  •  ヘルパ関数	    –  例)	  CakePHP	  の pr():	        pri...
MVC	  モデルの実現	•  ソフトウェアを次の	  3	  つの構造に分割する手法	    –  Model	        •  データの読み書きを行なう	    –  View	        •  データを表示する	    –  Co...
MVC	  モデル	•  イメージ	                       Controller	              View	                      Model	     HTML	             ...
MVC	  モデルのメリット	     •  独立性を確保	              –  機能ごとの役割が明確に	       •  依存性の抑制	              –  変更の影響を受けにくく	              –  ...
OR	  マッピング	•  Object-­‐Relauonal	  Mapping	  •  DB	  をオブジェクトとして扱う手法	                 id	 name	   mail	               1	 前田...
ルールの制定	•  命名規則	    –  変数名,テーブル名	  •  ディレクトリ構成	  •  コーディングスタイル	                       21
メリットのまとめ	•  開発工数の短縮	         –  同じようなコードを繰り返し書かなくて良い	  	  •  品質の均一化	  •  保守性の向上	  •  セキュリティの向上	         –  ルールが統一されるため	   ...
フレームワークのデメリット	•  学習コストがかかる	  •  どれが良いかわからない	    –  CakePHP	    –  Symfony	    –  Zend	  Framework	    –  CodeIgniter	     ...
フレームワークの選定基準	•  実用性	    –  安定性	    –  機能,対応バージョン	  •  開発の継続性	  •  ライセンス	  •  情報の入手しやすさ	                        24
 	  	         CodeIgniter	  の紹介	                                  25
CodeIgniter	  とは	•  	  [kóud ig・nít・er]	  •  ignite:	  [自動]	  発火する	  	  [他動]	  点火する	         	  •  無料,オープンソース (3.0	  から	  ...
「高速」 「軽量」 「低い学習コスト」	•  高速	     –  他のフレームワークと比較しても圧倒的	     –   	         CodeIgniter	   ベンチマーク	   検索	•  軽量	     –  ソースの容量は約...
とっつきやすい	•  日本語のユーザガイドが完備	  •  コマンドライン操作が不要	  •  レンタルサーバでも幅広く動作	   –  System	  は原則,外部ライブラリを不使用	   –  PHP	  のバージョンや設定の違いを (あ...
Apple	  も使ってる?	                                                                        CodeIgniter	hop://jobs.apple.com/in...
CodeIgniter	  の	  URL	      hop://example.jp/hoge/index.php/	  fuga	  /	  piyo	  /	  foo	                                 ...
 	  	         CodeIgniter	  の機能の一例	                                     31
フォーム検証	  •  検証ルールをセット	     –  $this-­‐>form_validauon-­‐>set_rules(	         	      	  ‘name	  属性の値’,	  	         	      	...
フォーム検証	  •  検証ルールの一例	     ルール名	            用途	   required	        なにか入力されているか	   matches[hoge]	   他のフィールドと一致するか	          ...
フォーム検証	  •  実際のコードの例:	      	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  :	                  検証ルールをセット	    	  	  	  	  ...
フォーム検証	  •  ユーザにエラーを表示 (検証失敗時)	         –  set_value():	  入力値	         –  form_error():	  エラーの内容	  	  •  例)	            <t...
データベースアクセス	•  対応 DBMS	     –  MySQL,MS	  SQL,Postgres,Oracle,SQLite	  	  etc.	  •  Acuve	  Record	     –  取得や挿入,更新を最小限のコード...
Acuve	  Record	  の使用法 (の一部)	•  取得:	  get()	      –  $query	  =	  $this-­‐>db-­‐>get(‘mytable’,	  10,	  20);	      	       ...
Acuve	  Record	  の使用法 (の一部)	•  挿入:	  insert()	      –  $data	  =	  array(	         	  	  	  	  	  	  	  ‘7tle’	  =>	  ‘My	...
 	  	         アプリを作ってみよう	                          39
例題アプリケーション	•  岡山の勉強会情報サイト 「おかやまべん。」	                                 40
開発の流れ	1.  機能を考える	  2.  どんなデータを扱うかを考える	  3.  テーブル構成を考える	  4.  Controller,	  View,	  Model	  の作成	                           ...
実装する機能	•  コミュニティ情報	  •  イベント情報	    –  一覧表示,詳細表示	    –  登録,編集,削除	                       42
テーブル構成	•  コミュニティ情報	  (communiues)	         名前	            型	         用途	       id	            int	       コミュニティ	  ID	     ...
Model	  の作成	•  テーブルごとに	  1	  つ	  •  models/	     –  communiues_model.php	  .……	  コミュニティ情報 	     –  events_model.php	  …………...
Model	  の作成	•  例)	  applicauon/models/	  events_model.php	  	      Class	  Events_model	  extends	  CI_Model	  {	         ...
View	  の作成	•  基本は	  HTML	  •  画面	  (ページ)	  ごとに	  1	  つ	  •  共通部分はブロック化して	  include	  •  テンプレートパーサの利用	     –  変数の出力	     – ...
Controller	  の作成	•  機能ごとに	  1	  つのコントローラ	  •  操作ごとに	  1	  つのアクション	  	  •  controllers/	     –  community.php	  …	  コミュニティ情...
Controller	  から Model,	  View	  をロード	•  例)	  applicauon/controllers/	  event.php	               Class	  Event	  extends	  ...
 	  	         実 演	                   49
 	  	         おわり	                   50
Upcoming SlideShare
Loading in …5
×

PHPフレームワーク入門

3,047 views

Published on

Published in: Technology
  • Be the first to comment

PHPフレームワーク入門

  1. 1. PHP  フレームワーク入門 Dec.  7,  2011   第1回 岡山PHP勉強会 sho  <sho@codeigniter.jp>
  2. 2. 本発表の主な対象者   Web  アプリをつくったことがある     &&     フレームワークを使ったことがない   2
  3. 3.       フレームワークってなに?   3
  4. 4. その前に…       こんな経験はありませんか?   4
  5. 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. 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. 7. いつも同じようなコード書いてね? •  よくある機能   –  ページ送り   –  ユーザ認証   –  設定値の取得   –  ファイルアップロード   –  メール送信  •  セッション管理  •  データベースアクセス  etc.   7
  8. 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. だれだよこんなコード書いたの… •  ルールが統一されていない   –  命名規則   –  ディレクトリ構成 –  インデント 9
  10. 10. サーバを移したら動かなくなった •  よくある原因  (PHP):   –  バージョンの違い   –  設定値の違い   –  外部ライブラリの不足   10
  11. 11. セキュリティが不安…… •  SQL  Injecuon  •  XSS  (Cross  Site  Scripung)  •  セッションハイジャック  •  ディレクトリトラバーサル    :   11
  12. 12.       心当たりがありましたか?   12
  13. 13.       フレームワークで解決!   (するかも)   13
  14. 14. “フレームワーク” •  framework  【名】  骨組み、枠組み、骨格  •  なにかの土台となるもの   14
  15. 15.       フレームワークの主な役割   15
  16. 16. 標準的な機能の提供 •  ライブラリ   –  ページ送り,ユーザ認証,ファイルアップロード,メール送 信    etc.  •  ヘルパ関数   –  例)  CakePHP  の pr():   print_r()  の結果を  <pre>  </pre>  で囲って出力   echo(‘<pre>’);   print_r($hoge);   pr($hoge);   echo(‘</pre>’);   16
  17. 17. MVC  モデルの実現 •  ソフトウェアを次の  3  つの構造に分割する手法   –  Model   •  データの読み書きを行なう   –  View   •  データを表示する   –  Controller   •  Model  と View  を制御し,ユーザの入力に応答する 17
  18. 18. MVC  モデル •  イメージ Controller View Model HTML File データベース 18
  19. 19. MVC  モデルのメリット •  独立性を確保   –  機能ごとの役割が明確に   •  依存性の抑制   –  変更の影響を受けにくく   –  部品の再利用性が向上   •  保守性の向上   –  デザインとビジネスロジックの切り分け  参考:  hop://www.atmarkit.co.jp/zava/javafaq/j2ee/j2e07.html 19
  20. 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. ルールの制定 •  命名規則   –  変数名,テーブル名  •  ディレクトリ構成  •  コーディングスタイル   21
  22. 22. メリットのまとめ •  開発工数の短縮   –  同じようなコードを繰り返し書かなくて良い    •  品質の均一化  •  保守性の向上  •  セキュリティの向上   –  ルールが統一されるため   22
  23. 23. フレームワークのデメリット •  学習コストがかかる  •  どれが良いかわからない   –  CakePHP   –  Symfony   –  Zend  Framework   –  CodeIgniter   •  Kohana,  FuelPHP,  ……   23
  24. 24. フレームワークの選定基準 •  実用性   –  安定性   –  機能,対応バージョン  •  開発の継続性  •  ライセンス  •  情報の入手しやすさ   24
  25. 25.       CodeIgniter  の紹介   25
  26. 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. 27. 「高速」 「軽量」 「低い学習コスト」 •  高速   –  他のフレームワークと比較しても圧倒的   –      CodeIgniter   ベンチマーク 検索 •  軽量   –  ソースの容量は約 1.2MByte  •  低い学習コスト   –  規約,覚えることが少ない   27
  28. 28. とっつきやすい •  日本語のユーザガイドが完備  •  コマンドライン操作が不要  •  レンタルサーバでも幅広く動作   –  System  は原則,外部ライブラリを不使用   –  PHP  のバージョンや設定の違いを (ある程度)  吸収  •  ほとんど設定が不要 28
  29. 29. Apple  も使ってる?   CodeIgniter hop://jobs.apple.com/index.ajs?method=mExternal.showJob&RID=92938 29
  30. 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. 31.       CodeIgniter  の機能の一例   31
  32. 32. フォーム検証  •  検証ルールをセット   –  $this-­‐>form_validauon-­‐>set_rules(      ‘name  属性の値’,        ‘表示名’,        ‘検証ルール’   );  •  検証   成功:  TRUE  /  失敗:  FALSE –  $this-­‐>form_validauon-­‐>run()   32
  33. 33. フォーム検証  •  検証ルールの一例   ルール名 用途 required なにか入力されているか matches[hoge] 他のフィールドと一致するか   (例:  E-­‐mailの確認入力) max_length[n] 文字数が n  以内か alpha_numeric 半角英数字か valid_email E-­‐mail  アドレスとして正しい書式か –  複数指定するときはパイプ |  で区切る   –  自前のルールを定義することも可能   33
  34. 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. 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. 36. データベースアクセス •  対応 DBMS   –  MySQL,MS  SQL,Postgres,Oracle,SQLite    etc.  •  Acuve  Record   –  取得や挿入,更新を最小限のコードで   –  各 DBMS  間の SQL  構文の違いを吸収   –  値を自動的にエスケープ  ※  もちろん自分で SQL  文を書くことも可能   36
  37. 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. 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.       アプリを作ってみよう   39
  40. 40. 例題アプリケーション •  岡山の勉強会情報サイト 「おかやまべん。」   40
  41. 41. 開発の流れ 1.  機能を考える  2.  どんなデータを扱うかを考える  3.  テーブル構成を考える  4.  Controller,  View,  Model  の作成   41
  42. 42. 実装する機能 •  コミュニティ情報  •  イベント情報   –  一覧表示,詳細表示   –  登録,編集,削除   42
  43. 43. テーブル構成 •  コミュニティ情報  (communiues)   名前 型 用途 id int コミュニティ  ID name varchar コミュニティ名 comment text コメント •  イベント情報  (events)   名前 型 用途 id int イベント  ID community_id int コミュニティ  ID name char イベント 名 comment text コメント 43
  44. 44. Model  の作成 •  テーブルごとに  1  つ  •  models/   –  communiues_model.php  .……  コミュニティ情報   –  events_model.php  ………………  イベント情報   44
  45. 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. 46. View  の作成 •  基本は  HTML  •  画面  (ページ)  ごとに  1  つ  •  共通部分はブロック化して  include  •  テンプレートパーサの利用   –  変数の出力   –  繰り返し制御   46
  47. 47. Controller  の作成 •  機能ごとに  1  つのコントローラ  •  操作ごとに  1  つのアクション    •  controllers/   –  community.php  …  コミュニティ情報   •  アクション:    index(),    detail(),    add(),    edit(),    delete(),    …   –  event.php  ………….  イベント情報   •  アクション:    index(),    detail(),    add(),    edit(),    delete(),    …   47
  48. 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.       実 演   49
  50. 50.       おわり   50

×