フレームワーク比較
ちょっとずづ違うフレームワークが、それこそ星の数ほどあります。それぞれ特徴があり、どれがいいのか、どれを選んだらよいのか、なかなか難しいと思います。
ここでは、Ethnaを含め、次の5つのフレームワークについて、簡単な比較をしたいと思います(2006年4月現在)。これを読んで、Ethnaっていけてるじゃん!って思っていただければ幸いです。。。
- Ethna
- PRADO
- Ruby on Rails (RoR)
- symfony
- Zend Framework (ZF)
まとめの表
Ethna | PRADO | RoR | symfony | ZF | ||
言語 | php4/5 | php5 | Ruby | php5 | php5 | |
ドキュメント | ○ | ○ | ◎ | ◎ | ○ | |
インストール | ○ | ○ | ○ | ○ | ○ | |
必要な文法 | ◎ | △ | ◎ | △ | ◎ | |
ソースの読みやすさ | ◎ | △ | △ | △ | ○ | |
使いやすさ | ○ | ○ | ◎ | ◎ | ○ | |
MVC | モデル | ○ | △ | ◎ | ◎ | ○ |
ビュー | ○ | ○ | ○ | ○ | △ | |
コントローラ | ○ | △ | ○ | ○ | ○ | |
Webアプリ特有 | ajax | △ | ◎ | ◎ | ◎ | ○ |
フォーム | ◎ | ○ | ○ | ○ | △ | |
セッション | ○ | ○ | ◎ | ◎ | △ |
くわしい比較内容
言語
フレームワークで使用している言語は、実際にアプリケーション開発に用いる言語と同じものになることでしょう。
- RoR
- その名のとおりRubyで作られたフレームワークであり、アプリケーションはRubyで書くことになります。
- Ethna
- php4、php5の両方に対応しています。
- PRADO、symfony、ZF
- php5のみに対応し、アクセス修飾や例外を利用したコードになっています。
ドキュメント
ドキュメント(サンプル、チュートリアル、APIリファレンスなど)の豊富さは、そのフレームワークのわかりやすさを決める重要なポイントとなります。
- symfony
- 本家サイトのオンラインドキュメントで比較すると、symfonyがいちばんわかりやすいのではないでしょうか。サンプルごとにチュートリアルがあり、またマニュアルはキーワードから該当個所を見つけやすいと感じました。
- RoR
- RoRも豊富なドキュメントがありますが、チュートリアルや分厚い本、HowToが多く、とりあえずこれだけ一通り読めば済む、というようなマニュアルが見当たりませんでした。
- ZF
- 現時点ではプレビューの段階ですが、すでに日本語のドキュメントが整備されています。サンプルはまだほとんど用意されていないようです。
- PRADO
- PRADOの重要な要素であるコンポーネントの説明が未完成だったり、日本語のページもあるものの未記入なページが多いようでした。
- Ethna
- Ethnaについては、APIマニュアルはあるもののドキュメントの整備はこれから、というところです。もっとも、すべて日本語で書かれているので、日本のユーザにとっては読みやすいと思います。
インストール
フレームワークを使うにあたって同時に必要となるライブラリと、それも含めてインストールの簡単さを比較します。
- Ethna
- PEARが必要になります。また、mysqlとsmartyの利用を前提としている部分がいくつかあります。Ethna本体はinclude_pathに入っていればいいので、root権限の無い環境でもインストールしやすいと思います。
- ZF
- 現時点ではデータベースの利用にPDOが必要なようですが、それ以外に必要なものは一切ないようです。
- RoR
- rakeなど必要なものは多いですが、RubyGemsがインストールできればgemによって簡単にインストールできます。ユーザも多いため、インストールで困ることはあまり無いかもしれません。
- symfony
- 依存するライブラリはcreole、pake、phing、propelと少し多めですが、PEARのコマンドでsymfonyといっしょにインストールすることができます。
- PRADO
- データベースを利用するにあたって、ADODBが必要になります。
必要な文法
フレームワークの言語に従ってプログラムを書いていくほかに、テンプレートを書いたりデータベースの設定を書いたり、その言語以外に必要な文法について比較します。
- ZF
- 現状php以外のものを書くことはないようです。
- Ethna
- テンプレートを書くときにSmartyの知識が必要です。
- RoR
- データベースの設定にyamlを使いますが、とても簡単です。'Convention over Configuration'と言われるとおり、設定ファイルを書くことはほとんどありません。
- symfony
- propelの利用に際してyamlやxmlでの設定が必要な場合があります。アプリケーションの設定をするファイルが多く、迷いやすいと感じました。
- PRADO
- アプリケーションの定義をapplication.specという名のxmlファイルで行う必要があります。あまり書きやすいとは言えないと思います。また、当然ながらコンポーネントをテンプレートに配置するために、コンポーネントをあらわすPRADO特有のタグを用いる必要があります。
ソースコードの量と読みやすさ
問題が発生したときにドキュメントを見ても解決しなければ、ソースコードを見たほうが早いことも多いでしょう。ここでは、フレームワーク自体のソースコードの量と読みやすさを比較します。
- Ethna
- コードの量は少なく、全体を眺めるのもそれほど苦ではありません。もっとも、その分だけ始めからできることも少なくなりますが、すでにphpで(PEARのライブラリなどを用いて)開発を行っている方には、自分のやり方をそのまま適用できる、というメリットがあります。
- ZF
- コードの量は少し多めですが、他のライブラリに依存することはほとんどありません。コード自体も「標準」と言ってよい記法になっており、読みやすいと思います。
- RoR
- コードの量は多く、なにか問題があったときにソースを読むことで解決するにはかなりの慣れが必要だと思います。特に、このプロパティやメソッドはどこで定義されているのだろう?と迷ってしまうことがよくあります。
- symfony
- symfony自体のコードの量はそれほど多くありません。コードも読みやすいと思います。ただし、インストールの項で触れたように、symfony本体でない部分のコードの量は相当な量があります。
- PRADO
- コードの量は少し多めだと思います。明確なコーディング規約が適用されておらず、ちょっと読みにくい部分がありました。
使いやすさ
ある程度の理解はできた上で、実際に使ってみるにあたり、拡張性やコードジェネレータについて比較します。
- Ethna
- アプリケーション側にいったん基底クラスを作り、それを継承したクラスのインスタンスとしてほとんどのオブジェクトが使われるため、アプリケーションごとの拡張がとてもやりやすくなっています。
- ある程度のコードジェネレータがありますが、基底クラスを継承して必要なメソッドを追加する程度は自分で書かなければならない場面があります。
- RoR
- コードジェネレータが整備されており、新たに自分でファイルを作る場面はないといってもいいほどです。
- ジェネレータはgemから多数取得することができます。
- 一方、ジェネレータが用意されていないものに関しては、慣れないとどう作っていいのかなかなかわからないと思いました。
- symfony
- RoR同様、コードジェネレータが整備されています。
- yamlによる設定がたくさんあり、ちょっとした動作の変更は設定ファイルを修正するだけで済むことも多いですが、そのぶん設定ファイルの量はかなり多くなっています。
- ZF
- コードジェネレータは現在のところ用意されていません。まだプレビューの段階ですが、アプリケーションのディレクトリ構造から自分で作らなければなりません。
- PRADO
- コードジェネレータは用意されていません。PRADO本体に添付される豊富なサンプルを参考に、自分で書いていくことになるようです。
MVC
フレームワークにはそれぞれ期待する開発の方針があり、基本的にはそれに従うことでアプリケーションの開発を手助けしてくれるものです。特に、現在主流となっているMVC(Model-View-Controller)の考え方に沿っているかどうかで大きく区別できると考えられます。
この中で、PRADOを除く4つのフレームワークはMVCフレームワークと言ってよいでしょう。一方、PRADOはサイトのいちばん最初に
PRADO is a component-based and event-driven framework for rapid Web programming in PHP 5.
と紹介されています。ページにコンポーネントを配置し、イベントを登録してゆく方針は、他のフレームワークとは大きく異なる特徴です。
モデル
主に、データベースに由来するデータの取り扱いのしやすさについて比較します。
- RoR、symfony
- ActiveRecord、propelにより、CRUDのscaffoldまで自動的に生成でき、取り扱いはとても簡単です。
- Ethna
- AppObjectというActiveRecordのようなものがありますが、複数のテーブルを扱うことはまだ発展途上です。
- ZF
- 現時点ではまだ未実装な部分がいくつかあり、なんとも言えませんでした。
- PRADO
- そもそもMVCフレームワークではないので比較はできませんが、データベースを用いたサンプルでは、SQL文を直接書いたものしかありませんでした。
ビュー
ビュー部分(テンプレート)の書きやすさについて比較します。
- Ethna
- ビュークラスとSmartyによるテンプレートによってビューを構成します。表示にのみ必要な処理をアクションから分離しやすい構成になっています。
- ヘルパーはまだありません。Smartyプラグインを使うための土台が用意されています。
- RoR、symfony
- phpもしくはerubyで書いたテンプレートをアクションで暗黙もしくは明示的に指定します。
- ヘルパーが多数用意されています。
- PRADO
- コンポーネントを配置するための、独自のタグを用いたテンプレートを書きます。
- ZF
- 基本的にはphpでテンプレートを書いてゆきます。フォームについてはヘルパーが用意されているようです。
- 現時点では '<?php echo $this->escape($this->text); ?>' と書かなければならず、少し面倒なように思いました。
コントローラ
あまり表に出ない部分ですが、気づいた点についていくつか挙げてゆきます。
- Ethna
- CLIやxmlrpcといった複数のゲートウェイに対応しています。
- ルーティングは、少しわかりにくいですが変更することができます。
- symfony
- yamlの設定ファイルでルーティングが簡単に指定できます。
- producion/development/test 環境の切り替えに対応しています。
- RoR
- ルーティング機構やコンソールが用意されています。
- producion/development/test 環境の切り替えに対応しています。
- ZF
- ルーティング機構が用意されているようです。
- PRADO
- application.specがコントローラに相当するのでしょうか...?
ウェブアプリ特有の話
ウェブアプリ特有の話として
- ajaxのサポート
- フォームから得られたデータの扱い(validationやfilter)
- アクションをまたぐデータの受け渡し(セッション)の扱い について比較します。
ajax
- PRADO
- コンポーネントにイベントを登録してゆく、というPRADOの方針はajaxをやりたいならもっとも相性がいいと思います。
- RoR, symfony
- prototype.jsのヘルパーと豊富なサンプルのおかげで非常に簡単にajaxを実現することができます。
- ZF
- 現状はフレームワークとしてのサポートがまだ用意されていませんが、incubatorにそれらしいものが見られました。
- Ethna
- 現在のところヘルパーがまだないため、実質的にテンプレートから自分で実装しなければならない状況です。
フォーム値
- Ethna
- フォーム値を保持するActionFormクラスがあり、フォーム値のvalidation、filter処理を担当します。
- symfony
- フォーム値はアクションからパラメータとして取得します。validatorとfilterは設定ファイル中で指定します。
- RoR
- フォーム値はアクションからパラメータとして取得しますが、標準ではActiveRecordを利用したvalidation処理しか用意されていません。
- ZF
- validatorとfilterをあわせたようなZend_Filterクラスがあります。値の取得については、現時点では$_POSTなどを直接参照するようなサンプルしかありませんが、incubatorにフォームエレメントのためのクラスが用意されているようです。
- PRADO
- 他とは大きく異なり、フォーム値は直接コンポーネントが持つ値としてセットされます。validatorはコンポーネントに登録します。フィルタは手動でやらなければならないようです。
セッション
- RoR, symfony
- セッションの取り扱いは簡単であり、セッションを用いた"flash"という機構を使ってデータを次のアクションに渡すことができます。
- Ethna, PRADO
- セッションを維持するクラスがあり、アクションから呼び出すことができます。
- ZF
- 現状はフレームワークとしてのサポートはまだ用意されていないようです。