Zend Frameworkとsymfonyの比較

Posted by Hiraku on 2011-10-30

Symfony2が盛り上がってる中、1の話で申し訳ないですが。symfony1.4とZend Framework1.11の両方を使う機会があったので、感じたことをまとめておきます。まだまだ理解が及ばないところもあるので、間違いとかあったら教えてくださいませm(_ _)m

Zend Frameworkとsymfonyはよく似ている

中身はどうあれ、特徴だけ書き並べていくと、2つともよく似たフレームワークに見えます。

  • 2007年にリリースされた、PHP第3世代フレームワーク(特にRailsの影響を強く受ける)
  • PHP4サポートを切り捨て、PHP5のみ対応。E_STRICT準拠
  • 階層のないMVC・FrontControllerといったアーキテクチャ
  • 柔軟性・拡張性などの謳い文句
  • 日本語ドキュメントもあるよ
  • 標準のviewは素のPHP。テンプレート継承の概念がなく、layoutで対応
  • PHPのフレームワークとしては大規模な部類。アプリの速度は遅めになる傾向
  • ちょうど今、バージョン1⇒2の大きな転換点を迎えている

よく似ているので、どっちを使ってもいいような気はするんですが、傾向というか感じたことを以下に書きます。

一番大きな違い=設計思想

コア部分の設計思想が180度違うように感じます。

Zend Frameworkはとにかく疎結合を重視しています。一部依存はあるにしろ、大体のコンポーネントが単独で使えるようになっています。ZF以外のフレームワークに、ZFのコンポーネントを合体させて使うことができます。第2のPEARとか言われる所以ですね。

逆にコンポーネント同士をつなぐグルー(糊)部分が弱い傾向にあります。zfコマンドやZend_Applicationが登場してかなり改善しましたが、まだまだ発展途上な感じです。「命令しない限り何もしない」ゆとり社員(偏見)的な態度で、普通使うような機能であっても一つ一つ有効にしていく必要があります。

symfonyはWebアプリの中心核たるべく作られている印象を受けます。ある程度依存に関しても割り切っていて、切り離しにくくなっていますが、その分のサポートは手厚いです。キャッシュやセッションといった機能も標準でONになっており、ソースをジェネレートした直後の状態で非常に豊富な機能が使えます。

コア部分の差し替えはかなり深い部分までできますが、あくまで「symfonyらしさ」を失わない範囲までです。「高速に開発できるよ!ただしオレ様の流儀に従った場合だけな!」みたいな。また、優秀すぎて要らない機能まで有効になっていたりするので、必要ない機能を切っていく作業が必要になることもあります。

どっちかというとsymfonyが普通で、Zend Frameworkが異常な気がしますけど。

大きな違いはここだけで、細かい部分を比較していきます。

Controllerの階層構造

両者とも階層のないMVCなんですが、さすがにそれだけでは辛かろうと複数のControllerをまとめてグループ化する機能があります。グループごとに共通の処理を書くことができます。

■Zend Framework

4階層です。applicationをまたぐと連携できませんが、moduleをまたぐ連携(forward)が可能です。またmoduleは不要であれば省略できます。

  1. application
  2. module
  3. action-controller
  4. action

■symfony

3階層です。appをまたぐ連携は基本的にできません。

  1. app
  2. module
  3. action

階層が深くできると自由度が上がりますが、その分スパゲッティコード化しやすくなるかもしれません。

Controllerの拡張ポイント

どちらのフレームワークでもクラスの単一継承をせずにControllerを拡張できるようになっています。単一継承は一度しか使えない切り札なので、継承以外で機能拡張ができるのはとても助かります。

多重継承の使えない言語においては委譲で拡張していくのが定石ですが、委譲のコードは長ったらしくなって面倒なんですよね^^;

■Zend Framework

ActionHelperとFrontController-Pluginの2つが用意されています。複数のコントローラーで共通の機能が見つかったら、なるべくプラグインにしていくのが正しいやり方です。

ActionHelper
継承を使わずにActionControllerにメソッドを生やす機能です。
FrontController-Plugin
FrontControllerの処理中の特定のポイントに任意の処理を差し込める機能です。いつでも設定を変更できるので、actionの中でプラグインを追加したり、actionの実行直前にプラグインを無効化する、なんてこともできます。

■symfony

mixinとフィルターとEventDispatcherの3つが用意されています。Zendより豪華です。

mixin(sfMixer)
コントローラーに限らず、委譲コードをすっきり書くための補助クラスです。疑似的にmix-inができます。ZFのActionHelperに相当します。
フィルター
symfonyのコアはフィルターチェインという機構で実現されています。用語がややこしいですが、文字列を変換する機能に留まらず、任意の処理を差し込める機能をフィルターと呼んでいます。追加するだけでなく、なんとコアのフィルターを差し替えることもできます。ただし、actionの実行すらフィルターで実現されている都合上、actionの中からフィルターを変更することはできないようです。
sfEventDispatcher
まだよく理解していないんですが、JavaScriptなどでよくある、イベントベースの拡張ができるようです。Controllerに限らず「キャッシュがクリアされたとき」「Controllerが見つからなかったとき」「例外が発生したとき」などなどあらゆる部分でイベントを発生させることができ、そこをフックして機能を差し込むことができます。
sfEventDispatcherは単独でも使えるらしいので、別のフレームワークで使ってみるのも面白いかも?

symfonyの、「コア部分までフィルターで実現して置き換え可能にする」という設計はとても面白いです。イベントベースの拡張ができるようになったので、sfMixerはあまり使われなくなってきている感じでしょうか。

ZFの方が見劣りしますが、ZF2でZend\Eventがサポートされるようです。

ただ、PHP5.4でtraitsによる多重継承が公式サポートされれば、こんなややこしいことをしなくてもよくなるかもしれませんね。

CLIツールの充実度

CLIはsymfonyの方が高機能です。ひな形の生成はもちろん、DBスキーマのマイグレーションを行ったりキャッシュを削除したりテストを走らせたりと、一通り必要な機能がそろっています。

Zend FrameworkのZend_Toolは拡張性としては十分なものですが、デフォルトで実装されている機能がまだまだ少なめです。コードの生成ぐらいがメインになるでしょう。

Zend Frameworkを使う場合、現時点ではzfコマンドだけに頼らず別のツールを併用した方がいいように思います。Apache AntのPHP版であるPhingとか、結構いいですよ。

テスト駆動

■symfony

テストについても、symfonyの方がサポートされている感じがあります。symfony1はlimeという独自のテスティングフレームワークを使っており、フレームワークに統合されています。すぐにでもテストを書き始められます。

あとfunctionalテスト用のsfTestFunctionalがとても変態的(褒め言葉)。PHPのメソッドチェインでここまでやるかって感じの言語内DSLで書いていきます。

■Zend Framework

Zend FrameworkはPHPUnitを採用していますが、別にCLIツールでテストのひな形を作ってくれるわけでもなく、「テスト?PHPUnitでも使って勝手にやれば?」みたいに突き放されている感じがあります。

functionalテストはPHPUnitの拡張クラスの形でZend_Testを提供しています。

PHPUnitは高機能なんですが、その反面どうしてもとっつきにくく、もうちょいフレームワーク側のサポートがあるといいなあと思います。

サードパーティ製プラグイン

■symfony

symfonyはプラグイン機能をサポートしており、公式ページでプラグインを配布しています。

■Zend Framework

プラグイン機構がありません。Zend Frameworkベースのアプリはsymfonyほど構造が統一されないため、やりにくいのかもしれません。

その分、Zend Framework自体の機能がやたら豊富です。WebAPIに問い合わせるだけのモジュールなども公式で揃っています。

コーディング規約

趣味の問題かもしれませんが、symfony1のコーディング規約が未だによくわかりません。。

  • クラス名がlowerCamelCase、スペース2個でインデントなどなど
  • どのディレクトリにクラスが存在するのか直感でわからない(覚えるしかない)
  • 全体的に書き方がPHP(PEAR)っぽくない

その点、Zend FrameworkはPEARのコーディング規約をよりモダンにシンプルにしたコーディング規約に沿っており、ソースコードは非常に読みやすいです。個人的にZend Frameworkで一番好きなのはソースコードの見た目です。

Symfony2はZend Frameworkっぽいコーディング規約に切り替わっているので、Symfony2を使うといいのかも。

総評

symfonyの方が包括的なサポート力を感じるので、右も左もわからないならsymfonyを使った方がいいと思いました。Zend Frameworkは2番目に学ぶフレームワークとして優秀です。

ただ、Symfony2は見た目も疎結合度もZend Frameworkっぽくなっていますし、Zend Framework 2もEventがついたりしてSymfonyっぽくなっています。どっちも行き着く先はよく似たものな気がします。

symfony 1.4によるWebアプリケーション開発―オープンソース徹底活用 [単行本] / 日本Symfonyユーザー会 (著); 秀和システム (刊)
symfony 1.4によるWebアプリケーション開発


keyword: PHP zendframework symfony

PHPの最新記事

×

この広告は180日以上新しい記事の投稿がないブログに表示されております。