81
フレームワークを使うべき 3 つの理由 PHP カンファレンス関西 2014 2014/6/28 向井賢一

フレームワークを使うべき 3 つの理由

Embed Size (px)

DESCRIPTION

PHP カンファレンス関西 2014 の発表資料です。 13:30-14:00 フレームワークを使うべき 3 つの理由 http://conference.kphpug.jp/2014/

Citation preview

Page 1: フレームワークを使うべき 3 つの理由

フレームワークを使うべき 3 つの理由

PHP カンファレンス関西 2014 2014/6/28 向井賢一

Page 2: フレームワークを使うべき 3 つの理由

ご来場 ありがとうございます

自宅 (横浜)の

近所の居酒屋の看板

漫☆画太郎?

Page 3: フレームワークを使うべき 3 つの理由

会場のスタッフの皆様 マジでリスペクト!

Page 4: フレームワークを使うべき 3 つの理由

自己紹介

• 向井賢一 • 職業 : 雑用係

• https://twitter.com/mukaken

• https://www.facebook.com/mukaken

Page 5: フレームワークを使うべき 3 つの理由

運営しているサイト・イベント• FuelPHP 日本語ニュース (facebook)

• Laravel 日本語ニュース (facebook)

• FuelPHP 英語コミュニティ (facebook)

• FuelPHP 日本語コミュニティ (facebook)

• Laravel jp 日本語コミュニティ (facebook)

• Laravel Meetup Tokyo (次回 7/4(金) 19:00- 東京都渋谷区)

Page 6: フレームワークを使うべき 3 つの理由

好きな曲

PHP The Anthem

http://www.youtube.com/watch?v=S8zhmiS-1kw

Page 7: フレームワークを使うべき 3 つの理由

注意!

Page 8: フレームワークを使うべき 3 つの理由

PHP Web フレームワークは PHP が分からないと

使えません

$factorial = function($n) use (&$factorial) {! if ($n <= 1)! return 1;! else! return $n * $factorial($n - 1);!};!!var_dump($factorial(6));

Page 9: フレームワークを使うべき 3 つの理由

Web アプリケーションフレームワーク

の事を

フレームワーク

と略しています

Page 10: フレームワークを使うべき 3 つの理由

セッションの内容• PHP の文法は一通り理解したが、 Web アプリケーションフレームワーク を使った事がない方を対象にべた書き(モノリシック)な PHP プログラムを、Web アプリケーションフレームワーク を使い修正し、何が違うのかを比較をします。

• PHP の Web アプリケーションフレームワークで代表的なものを紹介し、それぞれを比較します。

Page 11: フレームワークを使うべき 3 つの理由

今朝の基調講演で郡山さんが話されていた「フレームワークとは?」

• アプリケーションの制約

• 原則に従う

• 長期的な変更

当セッションで 言いたい事は同じ!

Page 12: フレームワークを使うべき 3 つの理由

セッションの目次• フレームワークの説明でよく使われる用語の解説

• なぜフレームワークを使うのか ?

• 実際に PHP を使って説明

• PHP フレームワークの種類

• 参考サイト 参考文献

• まとめ

Page 13: フレームワークを使うべき 3 つの理由

フレームワークの説明で よく使われる用語の解説

Page 14: フレームワークを使うべき 3 つの理由

MVC モデル• 現在の フレームワーク で主流のアーキテクチャ

• モデル、ビュー、コントローラの3つに分けて実装する

• Web で使われているフレームワークは、正確には元祖 MVC ではなく MVC 2

Page 15: フレームワークを使うべき 3 つの理由

DRY 原則

• DRY は Don’t Repeat Yourself (繰り返しをさけること)の略

• プログラムを作る際にコピー&ペーストをすると、修正するときに大変な事になりますよ、との教訓

『達人プログラマー』の P.27 より

Page 16: フレームワークを使うべき 3 つの理由

リファクタリング

• コードの記述のやり直し、再作業、再設計

• リファクタリングを行う場面は、二重化、直交してない設計、時代遅れの知識、パフォーマンスに問題がある場合

『達人プログラマー』の P.188 より

Page 17: フレームワークを使うべき 3 つの理由

コーディング規約• PHP はいろいろな記述ができるが、記述の統一性をもたせること

• 主には、命名規則、コーディングスタイル、禁止事項の事

• 例 : インデントをハードタブかソフトタブかのどちらかに統一する

Page 18: フレームワークを使うべき 3 つの理由

• 一定のルールに従ってファイルやクラスの名前を決めていれば設定不要で動作する機構

• Ruby on Rails が取り入れた設計思想で話題になった

• 逆の設計思想で「規約より設定」を採用したフレームワークも多数ある

設定より規約 (CoC)

Page 19: フレームワークを使うべき 3 つの理由

フレームワークの イメージ

ベテランのエンジニアに聞くと!

Page 20: フレームワークを使うべき 3 つの理由

本棚に例えると

• 何も考えずに本を本棚にしまうと、どこに何の本があるか分からない

• フレームワークを使うと図書館のように整理整頓された本棚になり、どこに何があるかは一目瞭然

Page 21: フレームワークを使うべき 3 つの理由

なぜフレームワークを使うのか ?

現代のソフトウェア開発の問題・要求

Page 22: フレームワークを使うべき 3 つの理由

いままでの開発で、 こんな事に困った事ありませんか?• チームで開発するさいに、それぞれの開発スタイルがバラバラで、コミュニケーションに時間がかかる

• チームで開発するさいに、新たにチームに加わってもらう開発者に説明するのに時間がかかりすぎる

• 過去に自分で開発したソースを読み返すと、どこに何の記述がしてあるか分からなくて、解読するのに時間がかかる

Page 23: フレームワークを使うべき 3 つの理由

近年のビジネス速度• 1990年代までのソフトウェアは業務の効率化を目的として作られ、一度作ったら長期間変更しないまま使い続ける

• 現在のソフトウェアはビジネスの変化に合わせて、その都度変更していく

• 現在ではソフトウェアのリリースサイクルが劇的に短くなってきている

Page 24: フレームワークを使うべき 3 つの理由

現在のソフトウェアは 常に作り替えなければならない

Amazon

は1時間に1,00

0回以上

デプロイしているそうです

Page 25: フレームワークを使うべき 3 つの理由

実際に PHP を使って 説明

http://www.slideshare.net/brtriver/php-14295877『フラットなPHPからフレームワークへ』から抜粋

前田さんの発表資料から引用・抜粋させて いただきました。

Page 26: フレームワークを使うべき 3 つの理由

モノリシックなPHPを

フレームワークに 書き換える

リファクタリングよって

Page 27: フレームワークを使うべき 3 つの理由

モノリシックなPHPView部分の分離

アプリケーション(ドメイン)部分の分離

フレームワーク

Page 28: フレームワークを使うべき 3 つの理由

DBからデータ取得し 取得したデータを

HTMLで表示する

Page 29: フレームワークを使うべき 3 つの理由

<?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> <?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>

DBからデータ取得

取得したデータを表示

list.php

Page 30: フレームワークを使うべき 3 つの理由

Browser PHP + HTML

list.php

クライアント サーバー

リクエスト

レスポンス

Page 31: フレームワークを使うべき 3 つの理由

悪い点

アプリケーションの拡張性が無い 体系化されていない 再利用性がない

Page 32: フレームワークを使うべき 3 つの理由

View部分の分離

Page 33: フレームワークを使うべき 3 つの理由

<?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> <?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

ロジック部分

View(HTML)部分

Page 34: フレームワークを使うべき 3 つの理由

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';

別ファイルに分離

ロジック部分

Page 35: フレームワークを使うべき 3 つの理由

Browser PHP

list.php

クライアント サーバー

リクエスト

レスポンス

HTMLtemplate/list.php

view

controller

Page 36: フレームワークを使うべき 3 つの理由

Browser PHP

list.php

クライアント サーバー

リクエスト

jsontemplate/list-json.php

view

controller

レスポンス

Page 37: フレームワークを使うべき 3 つの理由

テンプレートの変更に強い

View部分の分離

良い点

Page 38: フレームワークを使うべき 3 つの理由

アプリケーション(ドメイン) 部分の分離

Page 39: フレームワークを使うべき 3 つの理由

<?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');

データベースへ接続する

index.php

全てのポストを取得する

Page 40: フレームワークを使うべき 3 つの理由

データベースへ接続する 全てのポストを取得する

ドメイン

model.php に分離

Page 41: フレームワークを使うべき 3 つの理由

<?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)) { $posts[] = $row; } return $posts; }

model.php

get_database_connection

get_all_posts

Page 42: フレームワークを使うべき 3 つの理由

リファクタリング後のlist.php

<?php require 'model.php'; !

$posts = get_all_posts(); !

require 'templates/list.php';

コントローラーは制御するだけ

ロジック読込

全ポストを取得

ビュー読込

Page 43: フレームワークを使うべき 3 つの理由

コントローラが本来のコントローラーに

良い点

アプリケーション(ドメイン)部分の分離

シンプルなMVC

Page 44: フレームワークを使うべき 3 つの理由

Browser PHPlist.php

クライアント サーバー

リクエスト

レスポンス

HTMLtemplate/list.php

view

controller

Logicmodel.php

model

get_all_posts

$POSTS

Page 45: フレームワークを使うべき 3 つの理由

フレームワークを使って 書き直したら

Page 46: フレームワークを使うべき 3 つの理由

PHP でメジャーなフレームワークを 使って構築してみます

• Codeigniter を使用

• 覚える事が少ないので初心者向き

• バージョン 2系 を使います

Page 47: フレームワークを使うべき 3 つの理由

デモ

Page 48: フレームワークを使うべき 3 つの理由

フレームワークを 使っても失敗する例

フレームワークを使っても

意味がない例

Page 49: フレームワークを使うべき 3 つの理由

よくある失敗例• フレームワークの約束(設計思想)に沿って作ってない (例 : フレームワークが用意した設定ファイルがあるのに、違う箇所に設定を書いてしまう)

• 通称ファット・コントローラとよばれている、動くからといって何の処理も1カ所に記述してしまう

Page 50: フレームワークを使うべき 3 つの理由

PHP フレームワークの種類

Page 51: フレームワークを使うべき 3 つの理由

PHP の フレームワークといえば?

Page 52: フレームワークを使うべき 3 つの理由

•Laravel - 10,516 • Symfony - 8,536 • CodeIgniter - 7,760 • Zend Framework 2 - 4,763

Github ★の数

2014/6/27現在

Page 53: フレームワークを使うべき 3 つの理由

Google トレンド (世界)

http://www.google.com/trends/explore#q=Laravel%2C%20symfony%2BSymfony2%2C%20Codeigniter%2C%20Yii%2C%20CakePHP&cmpt=q

Page 54: フレームワークを使うべき 3 つの理由

PHPは歯ブラシである

PHPは歯ブラシくらい興奮に値する。シンプルで、毎日使う便利な道具。

http://j.ktamura.com/archives/1390

PHPの発案者 : Rasmus Lerdorf

Page 55: フレームワークを使うべき 3 つの理由

プログラミング言語の分類

高級品 Haskell OCaml F# Scala

Ruby Python C Java

C#

日用品 PHP

小規模 大規模

※高級品は使うのに覚悟がいる、日用品は手軽に使える、という意味です

Page 56: フレームワークを使うべき 3 つの理由

PHP フレームワークの分類

高級品 BEAR.Sunday Symfony

CakePHP Zend Framework 2

日用品 Laravel CodeIgniter

Yii

小規模 大規模

Page 57: フレームワークを使うべき 3 つの理由

他言語でイメージ言語 大規模重量 高速軽量

PHP Symfony Laravel CodeIgniter

Ruby Ruby on Rails Sinatra

Python Django Flask

Haskell Yesod Snap

Page 58: フレームワークを使うべき 3 つの理由

世界での転職市場の求人数•CodeIgniter 54件 •Symfony 50件 •CakePHP 48件 •Laravel 37件 •FuelPHP 2件

http://www.monster.com/

MONSTER 2014/6/27 調査

Page 59: フレームワークを使うべき 3 つの理由

各フレームワークの 比較

Page 60: フレームワークを使うべき 3 つの理由

Laravel

• URL : http://laravel.com/ • ライセンス : MIT • 対応する PHP : 5.4 以上 • 安定版最新バージョン : 4.2 • 開発元 : taylor otwell • 日本語のドキュメント : あり

Page 61: フレームワークを使うべき 3 つの理由

Laravel の特徴• 近年、爆発的に人気急上昇

• PHP ではないようなキレイなソースが書ける

• 日本語の書籍が充実

• Laravel の書籍 まとめ http://qiita.com/mukaken/items/

2058a193ee0ce6fbfd30

• 信頼性の高い Symfony エコスステムの上に構築

Page 62: フレームワークを使うべき 3 つの理由

Symfony

• URL : http://symfony.com • ライセンス : MIT • 対応する PHP : 5.3.3 以上 • 安定版最新バージョン : 2.5 • 開発元 : フランスのSensio社

Page 63: フレームワークを使うべき 3 つの理由

Symfony の特徴• 大規模重厚 • 多機能な分、インストールや習得に多くの時間がかかる

• 重いといわれていたが、2で改良され、シンプル・高速

• メンテナンスのロードマップが明確に提示 • 「PHP界のインフラ」と言われている

Page 64: フレームワークを使うべき 3 つの理由

Laravel と Symfony の違い

http://www.reddit.com/r/PHP/comments/1bdln1/symfony2_vs_laravel/c96ohf1

Laravel の作者 Taylor Otwell 曰く「Symfony 2 と Laravel 4 は Debian と Ubuntu の関係に近い」だそうです。

!Taylor Otwell が Symfony のカンファレンスに参加したり、 逆に Symfony プロジェクト の Fabien が Laravel のカンファレンスに参加したりと、お互いを意識しながらプロジェクトを進めている。

Page 65: フレームワークを使うべき 3 つの理由

CodeIgniter• URL : http://codeigniter.com • ライセンス : CodeIgniter License • 対応する PHP : 5.2.4 以上 • 安定版最新バージョン : 2.2.0 • 開発元 : アメリカのEllisLab • 日本語のドキュメント : あり

Page 66: フレームワークを使うべき 3 つの理由

CodeIgniterの特徴• 軽量高速 • 小規模開発向け • 日本国内ではライセンス問題で話題になったが、国外ではそれほどでもない感じがする

• 世界では根強い人気 • 現在、開発元が売りに出している • 国内での採用実績 : MTV Japan

Page 67: フレームワークを使うべき 3 つの理由

FuelPHP

• URL : http://fuelphp.com • ライセンス : MIT • 対応する PHP : 5.3 以上 • 安定版最新バージョン : 1.7.1 • 開発元 : コミュニティ • 日本語のドキュメント : あり

Page 68: フレームワークを使うべき 3 つの理由

FuelPHPの特徴•軽量高速 •小規模開発に向いている •規約より設定 (覚える事が少ない) • イースター・エッグが満載(喋るなど) •作る事に主眼を置いている • CodeIgniter に使い方が似ている

Page 69: フレームワークを使うべき 3 つの理由

Codeigniter vs FuelPHPhttp://ilikekillnerds.com/2012/10/codeigniter-vs-fuelphp-revisited/

DocumentationORM/ Database Abstraction

PHPの互換性 The Community

Codeigniter 選ぶポイントになるほどすばらしい

本格的なORMほどではないがdatabase query builder がある

変化しているが、レガシーPHPサポートによる肥大化

かなり巨大

FuelPHP新しいデザイン CIほど堅牢ではな

い強力な ORM PHPの新機能

をサポートより活発になってきている

10/25

Page 70: フレームワークを使うべき 3 つの理由

CakePHP

• URL : http://cakephp.org • ライセンス : MIT • 対応する PHP : 5.2.8 以上 • 安定版最新バージョン : 2.5.2 • 開発元 : アメリカのCakeソフトウェア財団

Page 71: フレームワークを使うべき 3 つの理由

CakePHPの特徴

• 小・中規模向け • 設定よりも規約(多くのルールがある) • CakePHP2は、内部の構造や基本的なルールが見直された

• 用語がケーキ関連

Page 72: フレームワークを使うべき 3 つの理由

参考サイト・文献

Page 73: フレームワークを使うべき 3 つの理由

参考サイト

• フラットなPHPからフレームワークへ

• http://www.slideshare.net/brtriver/php-14295877

Page 74: フレームワークを使うべき 3 つの理由

PHP でアーキテクチャを 学ぶならこの本

効率的なWebアプリケーションの作り方 ~PHPによるモダン開発入門

パーフェクトPHP

Page 75: フレームワークを使うべき 3 つの理由

アーキテクチャー集で 有名な本

ソフトウェアアーキテクチャ ソフトウェア開発のためのパターン体系

http://www.kindaikagaku.co.jp/information/kd0283.htm

2000.12.04発売 未だに、いろいろな文献から よく引用されている

Page 76: フレームワークを使うべき 3 つの理由

プログラマーの心得的な本

達人プログラマー システム開発の職人から名匠への道

Page 77: フレームワークを使うべき 3 つの理由

その他1

Chef実践入門 ~コードによるインフラ構成の自動化

CakePHP2 実践入門

Page 78: フレームワークを使うべき 3 つの理由

その他2

Webアプリケーション設計・実装のための フレームワーク活用の技術

Software Design (ソフトウェアデザイン) 2014年4月号 なぜMVCモデルは誤解されるのか?

Page 79: フレームワークを使うべき 3 つの理由

ウンチクを語りたい人に おすすめの本

SMALLTALKで学ぶ オブジェクト指向プログラミングの本質

Smalltalk という言語で MVC について語られています

Page 80: フレームワークを使うべき 3 つの理由

まとめ フレームワークを使う3つの理由

• チーム開発のさいの共通認識になる

• 整理整頓された見渡しの良いプログラムになり変更が容易になる

• 近年のビジネス速度の変化に柔軟に対応できるアーキテクチャの構築ができる

Page 81: フレームワークを使うべき 3 つの理由

ご清聴 ありがとうございました