笔贬笔フレームワーク入门1. PHP
?フレームワーク入門
Dec.
?7,
?2011
?
第1回 岡山PHP勉強会
sho
?<sho@codeigniter.jp>
2. 本発表の主な対象者
?
Web
?アプリをつくったことがある
?
?
&&
?
?
フレームワークを使ったことがない
?
2
3. ?
?
?
フレームワークってなに?
?
3
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
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
12. ?
?
?
心当たりがありましたか?
?
12
13. ?
?
?
フレームワークで解決!
?
(するかも)
?
13
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
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
22. メリットのまとめ
?? 開発工数の短縮
?
–? 同じようなコードを繰り返し書かなくて良い
?
?
?? 品質の均一化
?
?? 保守性の向上
?
?? セキュリティの向上
?
–? ルールが統一されるため
?
22
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
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