なぜフレームワークを 
使うのか 
第21回Creators MeetUp 
2014/10/18 向井賢一
会場のスタッフの皆様 
株式会社LIG 様 
ありがとうございます!
自己紹介 
• 向井賢一 
• PHPカンファレンスのスタッフ 
• https://twitter.com/mukaken 
• https://www.facebook.com/mukaken
先日(10/11)開催されたPHPカンファレンス2014の 
4F置いていたドリンクマシーンは 
本日の主催者の小島さんにセットしてもらいました。 
ありがとうございました!!
運営しているサイト 
• laravel.jp 
• FuelPHP 日本語ニュース (facebook) 
• Laravel 日本語ニュース (facebook) 
• FuelPHP 英語コミュニティ (facebook) 
• FuelPHP 日本語コミュニティ (facebook) 
• Laravel jp 日本語コミュニティ (facebook)
注意!
Web フレームワークは 
プログラム が分からないと 
使えません! 
$factorial = function($n) use (&$factorial) { 
if ($n <= 1) 
return 1; 
else 
return $n * $factorial($n - 1); 
}; 
var_dump($factorial(6));
Web アプリケーションフレームワーク 
の事を 
フレームワーク 
と略しています
セッションの内容 
• 何かしらのプログラミング言語 は一通り理解し 
たが、 Web アプリケーションフレームワーク 
を使った事がない方を対象にべた書き(モノリシッ 
ク)な プログラムを、Web アプリケーション 
フレームワーク を使い修正し、何が違うのかを 
比較をします
セッションの目次 
• フレームワークの説明でよく使われる用語の解説 
• なぜフレームワークを使うのか ? 
• 実際に PHP を使って説明 
• 参考サイト と 参考文献 
• まとめ
フレームワークの説明で 
よく使われる用語の解説
MVC モデル 
• 現在の フレームワーク で主流のアーキテクチャ 
• MVCはモデル、ビュー、コントローラの略で、 
この3つの部品に分けて実装する 
• Web で使われているフレームワークは、正確に 
は元祖 MVC ではなく MVC 2
DRY 原則 
• DRY は Don’t Repeat Yourself (繰り返しをさ 
けること)の略 
• プログラムを作る際にコピー&ペーストをする 
と、修正するときに大変な事になりますよ、と 
の教訓 
『達人プログラマー』の P.27 より
リファクタリング 
• コードの記述のやり直し、再作業、再設計 
• リファクタリングを行う場面は、二重化、直交 
してない設計、時代遅れの知識、パフォーマン 
スに問題がある場合 
『達人プログラマー』の P.188 より
コーディング規約 
• プログラミング言語 はいろいろな記述ができる 
が、記述の統一性をもたせること 
• 主には、命名規則、コーディングスタイル、禁 
止事項の事 
• 例 : インデントをハードタブかソフトタブかの 
どちらかに統一する
設定より規約 (CoC) 
• 一定のルールに従ってファイルやクラスの名前を 
決めていれば設定不要で動作する機構 
• Ruby on Rails が取り入れた設計思想で話題に 
なった 
• 逆の設計思想で「規約より設定」を採用したフ 
レームワークも多数ある
フレームワークの 
イメージ 
ベテランのエンジニアに聞くと!
本棚に例えると 
• 何も考えずに本を本棚にしまうと、どこに何の 
本があるか分からない 
• フレームワークを使うと図書館のように整理整 
頓された本棚になり、どこに何があるかは一目 
瞭然
なぜフレームワークを 
使うのか ? 
現代のソフトウェア開発の問題・要求
いままでの開発で、 
こんな事に困った事ありませんか? 
• チームで開発するさいに、それぞれの開発スタイル 
がバラバラで、コミュニケーションに時間がかかる 
• チームで開発するさいに、新たにチームに加わって 
もらう開発者に説明するのに時間がかかりすぎる 
• 過去に自分で開発したソースを読み返すと、どこに 
何の記述がしてあるか分からなくて、解読するのに 
時間がかかる
近年のビジネス速度 
• 1990年代までのソフトウェアは業務の効率化を 
目的として作られ、一度作ったら長期間変更し 
ないまま使い続ける 
• 現在のソフトウェアはビジネスの変化に合わせ 
て、その都度変更していく 
• 現在ではソフトウェアのリリースサイクルが劇的 
に短くなってきている
現在のビジネスでは 
ソフトウェアは 
常に作り替えなければならない 
Amazon は1時間に1,000回以上 
デプロイしているそうです
実際に PHP を使って 
説明 
前田さんの発表資料から引用・抜粋させて 
いただきました。 
『フラットなPHPからフレームワークへ』から抜粋 
http://www.slideshare.net/brtriver/php-14295877
モノリシックなPHPを 
リファクタリングによって 
フレームワークに 
書き換える
モノリシックなPHP 
View部分の分離 
アプリケーション(ドメイン)部分の分離 
フレームワーク
DBからデータ取得し 
取得したデータを 
HTMLで表示する
<?php 
$pdo = new PDO( 
'mysql:host=localhost;dbname=blog_db;charset=utf8', 
'myuser', 
'mypassword', 
array(PDO::ATTR_EMULATE_PREPARES => false) 
); 
$stmt = $pdo->query('SELECT id, title FROM post'); 
?> 
<html> 
<head> 
DBからデータ取得 
<title>投稿の一覧</title> 
</head> 
<body> 
<h1>投稿の一覧</h1> 
<ul> 
list.php 
<?php while ($row = $stmt->fetch(PDO::FETCH_ASSOC)): ?> 
<li> 
<a href="show.php?id=<?php echo htmlspecialchars($row['id'], ENT_QUOTES, 'utf-8') ?>"> 
取得したデータを表示 
<?php echo htmlspecialchars($row['title'], ENT_QUOTES, 'utf-8') ?> 
</a> 
</li> 
<?php endwhile; ?> 
</ul> 
</body> 
</html>
クライアントサーバー 
Browser PHP + HTML 
list.php 
リクエスト 
レスポンス
悪い点 
アプリケーションの拡張性が無い 
体系化されていない 
再利用性がない
View部分の分離
<?php 
$pdo = new PDO( 
'mysql:host=localhost;dbname=blog_db;charset=utf8', 
'myuser', 
'mypassword', 
array(PDO::ATTR_EMULATE_PREPARES => false) 
); 
$stmt = $pdo->query('SELECT id, title FROM post'); 
?> 
<html> 
<head> 
<title>投稿の一覧</title> 
</head> 
<body> 
<h1>投稿の一覧</h1> 
<ul> 
show.php 
ロジック部分 
View(HTML)部分 
<?php while ($row = $stmt->fetch(PDO::FETCH_ASSOC)): ?> 
<li> 
<a href="show.php?id=<?php echo htmlspecialchars($row['id'], ENT_QUOTES, 'utf-8') ?>"> 
<?php echo htmlspecialchars($row['title'], ENT_QUOTES, 'utf-8') ?> 
</a> 
</li> 
<?php endwhile; ?> 
</ul> 
</body> 
</html>
show.php 
<?php 
$pdo = new PDO( 
'mysql:host=localhost;dbname=blog_db:charset=utf8', 
'myuser', 
'mypassword', 
ロジック部分 
array(PDO::ATTR_EMULATE_PREPARES => false) 
); 
$stmt = $pdo->query('SELECT id, title FROM post'); 
// HTML部分のコードを読み込む 
require 'templates/list.php'; 
別ファイルに分離
クライアントサーバー 
controller 
Browser PHP 
list.php 
リクエスト 
レスポンス 
view 
HTML 
template/list.php
クライアントサーバー 
controller 
Browser PHP 
list.php 
リクエスト 
view 
json 
template/list-json.php 
レスポンス
良い点 
View部分の分離 
テンプレートの変更に強い
アプリケーション(ドメイン) 
部分の分離
index.php 
<?php 
$pdo = new PDO( 
'mysql:host=localhost;dbname=blog_db:charset=utf8', 
'myuser', 
'mypassword', 
データベースへ接続する 
array(PDO::ATTR_EMULATE_PREPARES => false) 
); 
$stmt = $pdo->query('SELECT id, title FROM post'); 
全てのポストを取得する
ドメイン 
データベースへ接続する 
全てのポストを取得する 
model.php に分離
<?php 
// model.php 
function get_database_connection() 
{ 
$pdo = new PDO( 
'mysql:host=localhost;dbname=blog_db;charset=utf8', 
'myuser', 
'mypassword', 
array(PDO::ATTR_EMULATE_PREPARES => false) 
); 
return $pdo; 
} 
function get_all_posts() 
{ 
$pdo = get_database_connection(); 
$stmt = $pdo->query('SELECT id, title FROM post'); 
$posts = array(); 
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
get_database_connection 
$posts[] = $row; 
} 
get_all_posts 
return $posts; 
} model.php
リファクタリング後のlist.php 
<?php 
require 'model.php'; 
$posts = get_all_posts(); 
require 'templates/list.php'; 
ロジック読込 
全ポストを取得 
ビュー読込 
コントローラーは制御するだけ
良い点 
アプリケーション(ドメイン)部分の分離 
コントローラが本来のコントローラーに 
シンプルなMVC
controller 
Browser PHP 
list.php 
クライアントサーバー 
リクエスト 
レスポンス 
HTML 
view 
model 
template/list.php 
Logic 
model.php 
get_all_posts 
$POSTS
フレームワークを 
使っても失敗する例フレームワークを使っても 
意味がない例
よくある失敗例 
• フレームワークの約束(設計思想)に沿って作って 
ない (例 : フレームワークが用意した設定ファイ 
ルがあるのに、違う箇所に設定を書いてしまう) 
• 通称ファット・コントローラとよばれている、 
動くからといって何の処理も1カ所に記述してし 
まう
フレームワークの種類 
プログラミング言語は、いろいろな用途のものがあるが、 
フレームワークにも用途別に別れている。
PHPは歯ブラシである 
PHPは歯ブラシくらい興奮に値する。 
シンプルで、毎日使う便利な道具。 
PHPの発案者 : Rasmus Lerdorf 
http://j.ktamura.com/archives/1390
プログラミング言語の分類 
高級品Haskell OCaml 
F# Scala 
Ruby 
Python C Java 
C# 
日用品PHP 
小規模大規模 
※高級品は使うのに覚悟がいる、日用品は手軽に使える、という意味です
PHP フレームワークの分類 
高級品BEAR.Sunday Symfony 
CakePHP Zend 
Framework 2 
日用品Laravel 
CodeIgniter Yii 
小規模大規模
他言語でイメージ 
言語大規模重量高速軽量 
PHP Symfony Laravel 
CodeIgniter 
Ruby Ruby on Rails Sinatra 
Python Django Flask 
Haskell Yesod Snap
参考サイト・文献
参考サイト 
• フラットなPHPからフレームワークへ 
• http://www.slideshare.net/brtriver/php-14295877
PHP でアーキテクチャを 
学ぶならこの本 
効率的なWebアプリケーションの作り方 
~PHPによるモダン開発入門 
パーフェクトPHP
アーキテクチャー集で 
有名な本 
2000.12.04発売 
未だに、いろいろな文献から 
よく引用されている 
ソフトウェアアーキテクチャ 
ソフトウェア開発のためのパターン体系 
http://www.kindaikagaku.co.jp/information/kd0283.htm
プログラマーの心得的な本 
達人プログラマー 
システム開発の職人から名匠への道
その他1 
Chef実践入門 
CakePHP2 実践入門 
~コードによるインフラ構成の自動化
その他2 
Webアプリケーション設計・実装のための 
フレームワーク活用の技術 
Software Design (ソフトウェアデザイン) 2014年4月号 
なぜMVCモデルは誤解されるのか?
ウンチクを語りたい人に 
おすすめの本 
Smalltalk という言語で 
MVC について語られています 
SMALLTALKで学ぶ オブジェクト指向プログラミングの本質
まとめ 
フレームワークを使う理由 
• チーム開発のさいの共通認識になる 
• 整理整頓された見渡しの良いプログラムになり 
変更が容易になる 
• 近年のビジネス速度の変化に柔軟に対応できる 
アーキテクチャの構築ができる
ご清聴 
ありがとうございました

第21回Creators MeetUp