Contenu connexe Similaire à PHPフレームワーク入門 (20) PHPフレームワーク入門1. PHP
フレームワーク入門
Dec.
7,
2011
第1回 岡山PHP勉強会
sho
<sho@codeigniter.jp>
2. 本発表の主な対象者
Web
アプリをつくったことがある
&&
フレームワークを使ったことがない
2
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
13.
フレームワークで解決!
(するかも)
13
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
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
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