PHP フレームワークの「FuelPHP」がスゴすぎる

新しいことを勉強して、久々に心底感動しました。

Twitter である方が Fuel についてつぶやきをしているのを拝見し、この時初めてその存在を知りました。。
PHP の新しいフレームワークで、複数のフレームワークのいいところを集めたものということだったので、ちょっと触ってみるかとダウンロードしてドキュメントを読みながら Hello World! を作ってみる。すると・・・

こ・・これはすごい・・


なにがすごいって、これまで私は「CodeIgniter」を超愛用していました。CodeIgniter は、もちろんそのほとんどがすごくいいのですが、若干だけ不満があったのです。しかし、FuelPHP では CodeIgniter の好きなところはそのままに、不満が全部吹っ飛んでいたのです。

では、その全貌をご覧入れましょう。



[広告] FuelPHP 入門書の決定版が発売されました。詳しくは、FuelPHP 入門書の決定版『はじめてのフレームワークとしての FuelPHP』が発売されます をご覧ください。

CodeIgniter に関わった人が開発しているので CodeIgniter にかなり近い

もともと CodeIgniter に関わった人たちによって、新たに開発されたフレームワークですので、テイストがかなり CodeIgniter に近いです。

FuelPHP でも CodeIgniter と同じく、モデルやビューを使わないでコントローラだけでコードを書くことも可能です。

データベースの扱いは CodeIgniter では SQL を直書きする query() メソッドと Active Record と呼ばれるクラス(Rails の Active Record とは違います)がありますが、FuelPHP でも同じように DB::query() メソッドと Query Builder と呼ばれる機能があります。

セッションも CodeIgniter ではデフォルトが Cookie セッションですが、FuelPHP も同じく Cookie セッションがデフォルトです。

PHP 5 の autoload で手動のロードが不要

CodeIgniter では、基本的にライブラリやヘルパーを使う前にロードしないといけません。例えば、セッションクラスをロードして hoge という項目の値をセッションから取得するには、

$this->load->library('session');
$data = $this->session->userdata('hoge');

のようなコードになります。

あるいは、CodeIgniter にも autoload と呼ばれる仕組みはありますが、これはシステムの初期化時に設定ファイルで指定されたものを必ずロードするという always load です。これは、下手をすると使わないものまで毎回必ずロードしてしまうことになり、パフォーマンスの悪化の原因にもなりえます。

FuelPHP は、PHP 5 の autoload を使っていますので、必要なときに自動的にクラスがロードされます。上記のコードは FuelPHP では簡潔に 1行で済みます。

$data = Session::get('hoge');

セッションを読み書きするメソッド名が短い

はい、お望みどおり get() と set() です。

バリデーションが $_POST 以外も検証できる

Validation::run() で引数に任意の配列を指定できます。

認証ライブラリが標準で提供されている

CodeIgniter には認証ライブラリが標準では提供されていません。これは、CodeIgniter の自由度を表すと同時に、多くのユーザの不満でもありました。また、今更みんなが満足できる認証ライブラリを提供できないというジレンマにも陥っていました。

サードパーティの認証ライブラリはいくつかあり、ユーザはそれらを使ったり自作したりしていることと思います。

FuelPHP では認証ライブラリが、CodeIgniter でいうところの Driver として提供されており、標準で SimpleAuth という実装が含まれています。

HMVC が標準で提供されている

また、CodeIgniter には、他のコントローラのメソッドを呼んだり、MVC をモジュールとしてまとめることができる HMVC という大変人気のあるサードパーティのライブラリがあります。

しかし、これはフレームワークのコアに関わる部分を変更するハックであり、CodeIgniter の開発が GitHub へ移行した後に HMVC の作者からの提案はされていますが、変更が大きく CodeIgniter 本体に簡単には取り込むことができません。

FuelPHP では、他のコントローラのメソッドを呼ぶ機能を HMVC requests、MVC をモジュールとしてまとめる機能を Modules として標準で提供しています。

標準で多数のテンプレートパーサをサポート

テンプレートパーサが Smarty じゃないと CodeIgniter を嫌っていた人がいますが、FuelPHP も標準のテンプレートは PHP です。

しかし、標準で Parser package が含まれており、

が使えるように driver が用意されています。

ちなみに、CodeIgniter でも Smarty を使うハックはいくつかサードパーティから提供されており、比較的簡単に使えます。

Scaffolding が本当に使える

CodeIgniter にも Scaffolding と呼ばれる機能は以前はあって、現在は廃止されていますが、これは簡易 CRUD 機能とでも言うべきもので、開発用の補助ツールでした。

FuelPHP には、一般的な意味での Scaffolding がコマンドラインツールとして提供されています。

$ oil create blog
$ cd blog
$ oil generate scaffold post title:string summary:varchar[250] body:text

上記のコマンドは、blog プロジェクトを作成し、Scaffolding で post に関する MVC のコードを生成しています。

ちなみに、Model については、Model_Crud クラスを継承してるだけのクラスが生成されるだけなので、実は、手で書いても大差はありませんが。

コマンドライン(CUI)については、好みが分かれると思いますが、FuelPHP ではコマンドラインを使うことで、さまざまな追加機能を使うことができます。嫌なら使わないことも可能です。

データベースマイグレーションも使える

先のコマンドにテーブル定義が含まれていたことに気づいた方もいると思います。

$ oil generate scaffold post title:string summary:varchar[250] body:text

上のコマンドは MVC のコード以外に、マイグレーションのコードも生成します。

以下のコマンドを実行すれば、実際にデータベースにテーブルが作成されます。

$ oil refine migrate

CodeIgniter にも 2.1.0 からマイグレーション機能が追加されましたが、元はこの FuelPHP の機能です。そして、FuelPHP ではマイグレーションのためのコードを oil コマンドが自動生成しますが、CodeIgniter はコマンドラインを使わないというポリシーのため標準のコマンドはなく、マイグレーションのためのコードを手動で書く必要があります。

PHP 5.3 専用のフレームワークである

最先端のフレームワークというにふさわしく、過去はすっきりと切り捨てています。名前空間やその他 5.3 の機能が使いたかった方も心置きなく使うことができます。

開発コミュニティが活発である

FuelPHP は、2011年1月8日に 1.0.0-BETA1 がリリースされた、かなり新しいフレームワークです。

しかし、すでに GitHub での fuel/core でのコントリビュータ は 75人に達しています。

すでに巨大なコミュニティを持つ CodeIgniter は 8月に GitHub に引っ越したとはいえ、77人です。

ビューに渡された変数はデフォルトでエスケープされる

FuelPHP では output_filter という仕組みがあり、デフォルトが Security::htmlentities() で処理されるようになっています。

htmlentities() というのがちょっと気になりますが、htmlspecialchars() に変えるのは簡単でしょう。

標準で ORM も入っている

使う使わないはユーザの自由です。

MongoDB や Redis も標準でサポート

はじめからクラスが用意されています。

レイアウト機能も用意されている

ビューでのいわゆるレイアウト機能が、標準のコントローラを拡張した Controller_Template クラスとして含まれています。

CodeIgniter でいうなら、MY_Controller クラスの 1つを標準で含めている感じです。

最初からユニットテストPHPUnit

ややこしいハックをしないと PHPUnit が使えず、しかも HMVC を入れると動かなくなるとか困ることはありません。最初から PHPUnit です。FuelPHP 本体のテストも含まれています。実際には、まだ、本体のテストはかなり少ないのですが。

テストには PHPUnit の知識が 100% そのまま使えます。FuelPHP の TestCase クラスはまだ PHPUnit そのままですから。

PHPUnit 関連のツールも当然使えます。Jenkins 万歳!!

結論

その後、カレンダーを作ったり、ファイルアップロードを作ったり、メール送信を作ったりしてみると、またまた感動の嵐だったわけですが、そのあたりはまた後日にサンプルプログラムなども含めて紹介していきましょう。とにかく、FuelPHP は丁度 JavaScript で「jQuery」を触ったときのような、感動を味わうことができました。

ただし、これをもって「CodeIgniter より FuelPHP の方が優れている。今すぐ乗り換えよう」とはなりません。そもそもの思想の違いだと思います。

私が、CodeIgniter を「うざったい」と思うのは、反抗期の子供のようなもので、あれこれと自分で作り込んでいかないといけない CodeIgniter に若干面倒くささを感じているのだと思います。
FuelPHP は、そこを「もうあるよ」と提供してくれるので、楽な気がするのですが、おそらく、はまり始めると自分で作り込んでいく力が損なわれる恐れがあります。そうなれば、CodeIgniter のそっけなさはかえって助かることになるでしょう。

また、コミュニティや日本語情報、サートバーティライブラリの豊富さなども CodeIgniter の魅力としては外せません。なかなか悩ましい選択ですが、こうしていろいろ選べるのも楽しみの一つかなと思い、どちらも愛用していこうと思います。

また、どちらの記事も今後書いていきます。

この記事は、一部フィクションです。