スライド1: 2009年のPHPフレームワーク株式会社RYUS佐藤琢哉
スライド2: ※注意事項• フレームワークわかったよね!• さわださんのプレゼンで理解したという前提の内容です• 詰め込んでしまったので説明が薄かったらごめんなさい• フレームワーク自作の話は出てきません
スライド3: アジェンダ• 自己紹介• フレームワーク紹介• フレームワークで注目すべき点• フレームワーク比較• 比較まとめ• これからのフレームワーク
スライド4: 自己紹介• 佐藤琢哉• nazo• 株式会社RYUS所属▫上京して就職したいという方は是非弊社へ
スライド5: 自己紹介• 北海道旭川市出身▫明日が兄の結婚式なので来たのがきっかけ▫18歳で上京▫ゲーム→Web
スライド6: 自己紹介• rhacoja• himote.jp• http://d.hatena.ne.jp/nazone/• 実は代表的な制作物がない• 実はまともな勉強会で喋るのは初めて
スライド7: 自己紹介• フレームワーク利用履歴▫Ruby On Rails▫CakePHP▫symfony▫rhaco▫Ethna
スライド8:
スライド9: ■彼氏が素のPHPでコード書いてた。別れたい…素のPHPだとコードレビューの時なんか恥ずかしいww下向いちゃうしww男にはせめてフレームワーク使って欲しい・・・mysql_query直書きとかされたら・・・・もう最悪wwせめて普通にCakePHPやsymfonyぐらいは使って欲しい。常識的に考えて欲しいだけなんです!素のPHPのコードを見せられた時の恥ずかしさとか分かる?あのね?たとえば週末10??20人ぐらいで勉強会とか行くでしょ?それぞれ自分の使ってるフレームワークネタとか出すわけじゃない?みんな普通にCakePHPやsymfonyやZendFrameworkやEthnaを使ってるわけでしょ?素のPHPでノコノコついてったら大恥かくでしょうがww
スライド10: フレームワーク紹介の前に• PHPのフレームワーク多すぎじゃね?
スライド11:
スライド12: 多すぎ• さらに同じフレームワークでもバージョンによって全然違ったりする▫CakePHPとか▫symfonyとか▫Mapleとか
スライド13: とりあえず絞る• Ethna• symfony• CakePHP• ZendFramework• Maple• CodeIgniter• Piece Framework• rhaco• Sabel• Yii Framework
スライド14: PHPのフレームワーク多すぎじゃね?• なんでこんなに多いの?▫作りやすい▫動かしやすい▫自分の好みに合わせたい
スライド15: 作りやすい• 標準機能が豊富▫DB接続▫日本語変換(mbstring)• 自身がテンプレートエンジン(あるいはSmarty)
スライド16: 動かしやすい• 書けばすぐ動く▫mod_php▫他言語だとWSGIとかRackとか• どのレンタルサーバーでも大体動く
スライド17: 自分の好みに合わせたい• ユーザーが多い• 好みも多様化
スライド18:
スライド19: フレームワークで注目すべき点• Rails以前/以後• MVC• フルスタックかどうか• ライフサイクル• その他機能
スライド20: よく聞く意見「フレームワーク使いたいんだけどどれがいいの?」「Cakeかsymfonyじゃね?」←ぺちぱー「うちで○○使ってるけどそれなりに使えたよー」←よく訓練されたぺちぱー ./ ;ヽ l _,,,,,,,,_,;;;;i l l''|~___;;、_y__ lミ;l ゙l;| | `'",;_,i`'"|;i | ,r''i ヽ, '~rーj`c=/ ,/ ヽ ヽ`ー"/:: `ヽ / ゙ヽ ¯、::::: ゙l, ホント ぺちぱーは地獄だぜ! フゥハハハーハァー |;/"⌒ヽ, \ ヽ: _l_ ri ri l l ヽr‐─ヽ_|_⊂////;`ゞ--―─-r| | / | ゙l゙l, l,|`゙゙゙''―ll___l,,l,|,iノ二二二二│`""""""""""""|二;;二二;;二二二i≡二三三l | ヽ ヽ _|_ _ "l¯¯¯¯¯¯ |二;;二二;;二='''''''''''¯ノ /"ヽ 'j_/ヽヽ,¯ ,,,/"''''''''''''⊃r‐l'二二二T¯¯¯ [i゙''''''''''''''''"゙゙゙¯`"/ ヽ ー──''''''""(;;) `゙,j" | | |
スライド21: Rails以前• strutsもどき▫今みたいな便利機能は少ない▫Smartyが大人気▫O/Rマッパーがあまり知られてなかった
スライド22: Railsで出てきた機能• scaffoldの有無▫「10分でブログを作る!」のあれ▫実際は役に立たないことのほうが多い▫管理画面を作るのに使えるかも程度▫カスタマイズしやすい作りになっているのもある
スライド23: Railsで出てきた機能• DRY(Don't repeat yourself)▫同じコードを2度書かない▫やりかたは様々▫そもそもPHPだと限界が…▫基本ライブラリの充実でカバー
スライド24: Railsで出てきた機能• テスト環境が用意されてる▫TDD(testdriven development)ができる▫詳しくはこの後のkunitさんのお話で!
スライド25: Railsで出てきた機能• O/Rマッパー▫データベースと接続するあれ▫ActiveRecordパターンが多い▫Rails以前は(PHP界では)O/Rマッパー何それな空気だった(かもしれない)・ 無かったわけではないと思う
スライド26: 何だかんだでRailsはすごい• 「Rails世代フレームワーク」という名称• CakePHPはRailsとほぼ同じ構成• 他のフレームワークでもどこかしら影響を受けている
スライド27: んじゃRailsのほうがいいんじゃね?• PHPならではのメリットもある▫環境が作りやすい▫馴染みのある言語▫PHPで使いやすいようにアレンジ• 後発の強み
スライド28: MVC• きっと説明済だと思うので省略
スライド29: そもそもフレームワークとは• Webサイトを作りやすくするための仕組み▫広義ではCGIもフレームワーク▫Apache(コントローラー)→スクリプト(ロジック)
スライド30: MVC• MVCパターン▫Model(ロジック)▫View(テンプレート)▫Controller(MVの中継)
スライド31: MVC• MVC以外のフレームワークもある▫正直説明できないので省略▫Java界隈に多いかも?
スライド32: MVC• MVCだと何がいいの?▫Model(ロジック)とView(テンプレート)の分離▫きっとこの前の人が喋ってくれてるはず
スライド33: フルスタック• 全部入り• PHPはPEARがしょぼいせいかフルスタックが多い▫openpearに期待• PerlはCPANが元気なのでフルスタックじゃないフレームワークが強い
スライド34: ライフサイクル• ちゃんとメンテされてる?• コミュニティは活発?• 突然極端な変更されたりしない?▫no trunk no (略
スライド35: その他• ステートレス/ステートフル▫多分PHPではPieceだけ(あとSabelがちょこっと)▫ステートフル=入力データが複数画面に渡って継続して保持される▫Javaでは人気?▫http://www.slideshare.net/yoshiori/ss268210/
スライド36: その他• DI/AOP▫DI(依存性注入)▫AOP(アスペクト指向プログラミング)▫既にある機能を直接変更せずにあれこれする▫主にJavaで流行っている▫LLではそもそもクラスの書き換えが簡単なため(PHPはそれほど楽ではないが)、そこまで必要とされない
スライド37: その他• 対応DB▫MySQLはほとんどので対応されてる▫次点はPostgreSQL/SQLite▫Oracleとか使う人もたまにいる
スライド38: フレームワークで注目すべき点• これらを踏まえて、各フレームワークが具体的にどういう実装になっているか見ていきましょう
スライド39:
スライド40: ~国内知名度No.1(Google Trends調べ)~
スライド41: CakePHP• 最近国内でカンファレンスまでやった▫海外から開発者が!• 盛り上がりは間違いなくNo.1
スライド42: CakePHP• 「RailsをPHPで」• RailsをPHPに移植しようと思ったけどPHP4の機能じゃとても作れないのでPHPになじむようにアレンジしたフレームワーク• いろんなところでRailsに似ている▫MVC、ActiveRecord• 「Cakeのやり方に合わせるとものすごく簡単に書ける」
スライド43: CakePHPフォルダ構造
スライド44: CakePHP – Modelclass Article extends AppModel{var $name = 'Article';var $useTable = 'article';var $hasAndBelongsToMany = array('Category' => array('className' => 'Category','joinTable' => 'category_list','conditions' => "",'order' => '','dependent' => true,'foreignKey' => 'article_id','associationForeignKey' => 'category_id','unique' => false,'limit' => null,));}※ http://project-p.jp/halt/anubis/blog_show/999
スライド45: CakePHP• コミュニティが活発なので誰かが教えてくれる• 1.2がまだリリースされてないけど、今から覚えるなら1.2• 書き方を縛られるのは嫌な人はちょっと?
スライド46: ~洗練されたフルスタックフレームワーク~
スライド47: symfony• CakePHPと並ぶ知名度• 元はMojaviからの派生プロジェクト• 実務利用で作ったフレームワークをオープンソース化• 日本でもCake、Ethnaに並ぶ利用率
スライド48: symfony• PHP5専用• Mojaviライクなfilterシステム• Propelとの強力な連携• 無駄に多いプラグイン• 何でもYAML• フォルダ構造が深い• キャッシュをうまく使わないと遅め
スライド49: symfonyフォルダ構成
スライド50: symfony – YAMLでテーブル定義propel:table1:table2:code: varchar(255)_foreign_keys:fk_1:foreign_table: table1references:-foreign: idlocal: codeon_delete: cascadeon_update: set null※ http://blog.symfony.jp/2006/12/18/schema-yml/
スライド51: symfony• 1.2がリリースされたので1.2を覚えておくといいかも?• フォルダ構造が複雑なため、シェルで全部書く人にはちょっと辛いかも• 規模の大きい開発をする人は検討したほうがいい
スライド52: ~国産といえばこれ~
スライド53: Ethna• GREEの藤本さんが中心になって開発(最近はあまり関わってない?)• GREEはEthnaで動いているという実績• フルスタックではない• 国内にコミッタ多数
スライド54: Ethna• Strutsっぽい• ややRails前世代• 強力なActionForm• DB周りは貧弱• Smartyを使うこと前提
スライド55: Ethnaフォルダ構成
スライド56: Ethna – フォーム定義class Flare_Form_IndexTest extends Ethna_ActionForm{var $form = array('mailaddress' => array('name' => 'メールアドレス','required' => true,'max' => 255,'filter' => FILTER_HW,'custom' => 'checkMailaddress','form_type' => FORM_TYPE_TEXT,'type' => VAR_TYPE_STRING,),...※ http://labs.gree.jp/Top/Document/20060707.html
スライド57: Ethna• O/Rマッパーは無いようなものなので(あるけど)、自分である程度カスタマイズできる人向け• 国内実績が多いので業務では使いやすいかもしれない• 国内利用者が多いので参考資料は見つけやすい
スライド58: ~あのZendが作った!~
スライド59: Zend Framework• あのZendが作った!▫という安心感?• 標準機能が豊富すぎる▫豊富すぎて一部分だけ切り出して使う方法がメジャーに▫SymfonyはZFのプラグインをそのまま使える機構が用意されている• 1.0リリースまでに時間がかかったため出遅れた感が強い▫最近は事例も増えてきた(公式で見れます)
スライド60: Zend Framework• そのままだと何もない• MVC部分は結構すっきりしてる• 大量のクラス群▫独自の世界を構築▫Twitter操作ライブラリとかOOoドキュメント操作ライブラリまである▫Full Packageだとtgzで21MB!• 細かいコーディング規約
スライド61: Zend Framework - Controller<?phprequire_once 'Zend/Controller/Action.php';require_once 'Zend/Date.php'; //Zend_Dateコンポーネントの呼び出しclass WingsController extends Zend_Controller_Action{public function codezineAction(){$date=new Zend_Date; // (1)$this->view->assign('dt', $date->get(Zend_Date::TIMES)); // (2)}}※ http://codezine.jp/article/detail/2162?p=1
スライド62: Zend Framework• symfony同様、PHP5で大規模開発したい人にはお勧め• ライブラリだけ使うことも検討
スライド63: ~高速フレームワーク~
スライド64: CodeIgniter• 超高速▫フレームワークのベンチマークを取ると絶対1位になるフレームワーク▫Cakeの倍くらいの速度?• 構造自体はCakeに似た感じ
スライド65: CodeIgniterフォルダ構造
スライド66: CodeIgniter• それなりにRails系MVC• テンプレートエンジンは素のPHP• それなりの機能のO/Rマッパー• 複雑な機能をできるだけ持たないことで高速化• 低機能というわけでもない
スライド67: CodeIgniter - Controller<?phpclass Welcome extends Controller {}function Welcome(){parent::Controller();}function index(){$this>load>view('welcome_message');}※CodeIgniter1.7.0付属のwelcome.phpより
スライド68: CodeIgniter• そこそこの機能さえあれば開発できる人ならお勧め• 速度を気にする人は検討してみるといいかも
スライド69: ~国産の有力候補~
スライド70: Maple• kunitさん(この後登場!)作成のフレームワーク• NetCommons2.0はMaple3ベースで作られている• 現在Maple4が制作中
スライド71: Maple• 詳しくはkunitさんに聞こう!(この後話が聞けると思います)▫丸投げとも言う
スライド72: ~ステートフルフレームワーク~
スライド73: Piece Framework• PHP唯一?のステートフルを前面に打ち出したフレームワーク• 国産• Eclipse用IDEも用意▫ステート作成とかが簡単に
スライド74: Piece_IDE
スライド75: Piece Framework• 各コンポーネントが分離されている▫Piece_Unity▫Piece_ORM▫Piece_Right▫Piece_Flow▫etc…• ステートフルなので根本的に違う▫フローをYAMLで書いて中身を実装
スライド76: Piece Framework – フロー定義firstState: DisplayNewlastState:name: DisplayNewFinishview: http://example.org/list.phpviewState:- name: DisplayNewview: Newtransition:- event: DisplayNewConfirmFromDisplayNewnextState: DisplayNewConfirm- name: DisplayNewConfirmview: NewConfirmtransition:- event: DisplayNewFinishFromDisplayNewConfirmnextState: DisplayNewFinish- event: DisplayNewFromDisplayNewConfirmnextState: DisplayNew※ http://gihyo.jp/dev/serial/01/piece/0005
スライド77: Piece Framework• 新しいもの好きならお勧め• アンケート系のような、入力が多数の画面に渡るようなものでは強いかも
スライド78: ~hentai++~
スライド79: rhaco• 国産• フレームワークと言われると?• Web画面からいろいろ設定ができる• 1系はもう頻繁な更新はない(no trunk no rhacoではない)
スライド80: rhacoのWebセットアップ画面
スライド81: rhaco• コントローラーとかはあるけど使わなくてもいい(エントリーポイントとか用意されてない)• 継承ができるテンプレートエンジン• 複雑なクエリも投げれるO/Rマッパー• 強力なHTML/XMLパーサ• DocTest
スライド82: rhaco - DocTestfunction is($varible,$base=true){/**** $bool = true;* eq(true,Variable::is($bool,true));* eq(false,Variable::is($bool,false));** $bool = false;* eq(false,Variable::is($bool,true));* eq(false,Variable::is($bool,false));**/return ($base && Variable::bool($varible));}
スライド83: rhaco• 個人でレンタルサーバとかでさっくり作るなら強い• HTMLやXMLをパースしてあれこれやるならお勧め(マッシュアップとか)• Lingrでいつでも質問できる!
スライド84: http://www.lingr.com/room/rhaco-ja
スライド85: ~国産の次世代フレームワーク~
スライド86: Sabel• 国産• ステートフルっぽい書き方もできる• アノテーション• 基本機能が充実
スライド87: Sabel – アノテーション<?php/*** @flow continuation userForm*/class Index_Controllers_Register extends Sabel_Controller_Page{...}/*** @httpMethod post* @flow next doRegister correct*/public function confirm(){$this->form->applyPostValues($this->userForm);if (!$this->userForm->validate()) {$this->view->setName("prepare");}}※ http://www.sabel.jp/tutorial/blog/p1_1
スライド88: Sabelフォルダ構造
スライド89: Sabel• DI、AOP• ステートフル• 複数のテンプレートエンジンを使える(Sabel独自、Smarty, Simplate, Savant3)• ユニットテストや国際化、マイグレーションも• しかし使われているところを見ない
スライド90: Sabel• いろんな機能を使ってみたい人向け• アノテーションとかを積極的に使わないともったいない• 1.2系はまだドキュメントが充実していないので1.1系推奨• ちょっと凝りすぎ?
スライド91: ~期待の新人~
スライド92: Yii Framework• 読み方は「イー」• Pradoの人が作ってるっぽい?• Rails系だが、かなりsymfony色が強い• 後発なのでいろいろ強いかもしれない
スライド93: Yii Framework• いろんなフレームワークを参考にしてる(主にRailsとsymfony)• RailsっぽいActiveRecordをちゃんと実装• symfonyっぽいfilter、キャッシュ、プラグイン機能• Pradoのテンプレートエンジンも使える
スライド94: Yii Frameworkフォルダ構造
スライド95: Yii Framework• まだ1.0がリリースされた直後なので、先取りしたい人向け• 伸びるかどうかは不明だが伸びそうな気配はある• ちょっとバグっぽい挙動が(特にcli周り)
スライド96:
スライド97: どれ使えばいいの?• PHPのバージョン• 開発規模• 過去の資産• 特殊機能• 変態度
スライド98: PHPのバージョン• 4系のサポートは終了しています!• でも業務上使わないといけないこともある• 5の機能わかんねーよ!って人も• CakePHP/Ethna
スライド99: 開発規模• 大きくなると出てくる問題▫各環境で設定を切り替える▫デプロイ▫テスト▫スケーリング• SymfonyはYAMLでの設定切り替えが強い/デプロイ機構もある• テストは結構どれにでも付いてる• DocTest(Maple/rhaco)
スライド100: 過去の資産• PEARとの連携▫Ethna• 最近のフレームワークはPEARを使わない方向が多い
スライド101: 特殊機能• どっかのAPIと連動とかー• ライブラリの多さに定評のあるZend Framework• HTMLパーサーが高機能ならどうにかなるかも
スライド102: 変態度• もちろんrhaco• PHPでDIとかステートフルとかも十分変態だと思う
スライド103: 現実的に今使うなら?• とっつきやすさ:CakePHP• 大規模:Symfony• 正直あんまりマイナーなフレームワークを使っても仕方ない• という無難な回答• 自力でフレームワークの使い方を開拓できるような人は何使うかくらい判断できるはず
スライド104: PHP以外という選択肢は?• 一人で使うならPHPが一番じゃない?(レンタルサーバ的な意味で)▫最近はVPSとか安くなってきてるからどうにかなるかも?• 複数人で使うなら他の人のスキルに合わせる必要がある▫「俺Ruby好きだからRailsね!」はKY▫「俺Scala好きだからliftね!」とか(略▫「俺Gauche好きだからKahuaね!」(略
スライド105: 新しいフレームワークを使うなら• 自分でコミュニティを開拓する気力が必要• 業務で使う場合に実績がないものをどうやって説得するか?▫事前に個人で実績を作ってしまうとか
スライド106:
スライド107: PHP4サポート終了• PHP4対応のフレームワークもPHP5に移行する動き▫rhaco2▫Maple4• PEAR2もPHP5専用になる予定
スライド108: PHP5.3• いつ出るの?• フレームワーク作成に便利な機能が沢山▫closure、namespace、Dynamic Static Call...• 5.3専用フレームワーク?
スライド109: DIとかAOPとかってどうよ?• そこまでやりたいならJavaに行けば?• どうしてもやりたい人のための選択肢は既に存在する• そこまで求められるケースが少ない(言語的に)
スライド110: ステートフルってどうよ?• 概念的には凄く便利• 入出力が多いアプリケーション(アンケート系?)とかには便利かも?• 設定する手間
スライド111: 設定ファイルの書き方• XML/YAML/PHP• XMLは嫌われる方向にあるが、書き方によっては便利• PHP直接は書きやすいが、PHP自体の表現力が厳しい• YAMLは書きやすいが意外と仕様が複雑
スライド112: 携帯対応• 海外では無縁なので本体が対応されることはない▫国産の活躍しどころ?• プラグインで対応が多い• 根本から変化する技術ではないが、独特のものが多い
スライド113: MVC以外の価値• 運用▫Deploy▫バージョン管理(migration)▫テスト• 負荷対策▫キャッシュ機構▫複数DB対応
スライド114: ajax対応• 別にいらなくね?• ものによる• PHP側としては基本的にはjsonとxmlが簡単に入出力できれば十分• sfModalBoxPlugin▫symfonyのMVCと上手く連動• Cometとかファイルアップロード進捗とかはどっちにしろそのままじゃ無理
スライド115: フレームワークで悩んでいいのは小規模までだよねー• 大規模になると▫O/Rマッパーが根底から別の要求になる▫RDBMSいらない• いろんなサーバーにいろんなアプリケーションが乗っかって1つの大きなアプリケーションになる▫現在のフレームワークは1サーバ1アプリケーションで完結することが前提▫そういう開発のほうが圧倒的に多いが…
スライド116: 逆に超小規模なのは?• rhacoが便利• Cakeですら大規模に思えるケース• 使い捨てアンケートフォームとか• いっそのこと素のPHP▫PDO使えばそれなりに組める• Perl界で軽量フレームワークブーム▫PHPは元々それができる
スライド117: まとめ• その機能が必要なのかを検討することが必要• 自分でコミュニテイを盛り上げるくらいの気持ちが必要
スライド118: おわり• ご静聴ありがとうございました