Lithiumを諦めてやっぱりSymfony2を試しだした

PHPのフレームワークはちょっとした過渡期でもある。PHP5.3はマイナーバージョンアップだったけど名前空間や無名関数、遅延バインディングなどがサポートされたことによっていろんな書き方ができるようになった。そこでPHP5.3以上を前提としたフレームワークが現れようとしている。

いち早くでてきたのがLithium。CakePHPをやっていた人がつくりだした軽量なフレームワーク。Lithiumは0.9.9まで来ていてNoSQLもサポートしている。Litihumでいこうといろいろ調べていたが出だしはよかったものの、いまいち最近マイルストーンが不明で不安になってきた。そんな中Symfony2もPHP5.3前提で出てきて、最初は起動シーケンスがわかるくらいで何もできないやつだったものの、ここにきて一気に追い上げてきてsymfony.comなんてドメインもとっちゃたりしてサイトもかなり作られてきた。現在はPreview Release 11というのが出ている。で、やっぱりSymfony2を真剣に使い出すことにした。

理由の一つはプロジェクトサイトがしっかりしていること。やっぱりfabian率いるSensio Labsという会社がちゃんとメンテナンスしているのが大きいし信頼ができる。

Symfony2ではかなりソフトウェアコンポーネントの再利用について気を払っているように感じる。あまり車輪の再開発はせずにdoctrineやswiftmailerなど外部のライブラリも引き続き積極的に利用していくそうだ。symfony 1.xより速くなるという話しもあるが外部ライブラリに頼る分サイズやオーバーヘッドは増えてしまう以上パフォーマンスについて過剰な期待をするのは禁物だと思う。生産性をとるかパフォーマンスをとるかバランスを取るのは開発者の仕事なので見極めが重要だ。

Symfony2を気に入ったのがBundleという設計思想。Bundleとはプラグインにも似ているが、BundleではControllerやView、routingなどの設定まで全部まとめられるようになった。単なる共有ライブラリというだけでなく、アプリをつくるにもまず一つBundleを作ることになる。(まだあまりModelとの絡みがよくわかっていないが・・・)viewはボトムアップでアプリ側のテンプレートに組み込むこともできるのでたとえばTwitterでログインするようなBundleをつくる場合にもroutingやviewまでつくっておけばいろんなアプリで使いまわせるし、他の人にも提供できるわけだ。(多分)

symfony 1.xではプロジェクトの中に複数のアプリケーションをもつことができた。エンドユーザ側に見せるfrontendアプリケーションと、管理用のbackendアプリケーションの二つをプロジェクトに持たせるのをよくやったりする。Symfony2では一つのプロジェクトは一つのアプリということになっている。そのため複数のアプリケーションでBundleをうまく共有するのが鍵になってくるのではないかと予想している。どっちがいいかは一概に言えないが、symfony 1.xの場合機能が増えていくとmodelやformsがカオスになってどのクラスをどのアプリがつかっているのかわからなくなっていく(管理ページ用のformやmodelなんかはfrontendアプリには必要ないものだし、その逆もあったりする)ので規模が大きくなればなるほどBundleごとにわけることの恩恵が受けられるのではないかと思われる。

フレームワークを使う場合できることをやる場合はサクサク進むけれど、ちょっと道をはずした場合に一気に使えなくなる。こういうときにBundleというものがあるのが大きいのではないかと思っている。もうBundleをあつめたhttp://symfony2bundles.org/というサイトもあったりするので自分がやりたいことと似ているBundleを探してそのソースコードを参考にすることができる。

プログラムは書くことよりも読むほうが勉強になる。ここにSymfony2の可能性を感じた。だから多少のパフォーマンスは目をつぶるし、パフォーマンスチューニングが必要になったらフレームワークを外したり、そのころlithiumが使えるようになってれば試せば良いと思っている。