Symfony2というPHPのフレームワークをプロジェクトで導入してみたので、そのお話をちょっとだけしたいと思います。

そもそもなんでSymfony2を使ったのか?

説明しろと言われると難しい部分もありますが、ドキュメントを読んで、さまざまな可能性があるフレームワークだと感じたためです。

CakePHPなどのモデルと呼ばれるクラスが存在するフレームワークだと、密結合になりやすいと過去の経験から感じていました。 密結合になりやすいのは、そもそもトランザクションスクリプトだからってことで一言で終わらされる気もしますが、あえて言うとしたら、「テーブル=モデル」となってしまっている部分が一番大きかったです。 「テーブル=モデル」のような構造だとどうしても、テーブル同士の関連が無いような処理で複数のモデルを使いたい場合に処理が複雑になってしまったり、モデルからモデルを呼び出すようなアプローチをしてしまい、コードも読みにくくなってしまいます。

Symfony2の場合はモデルというクラスが存在しないので、デーブル同士の関連に影響されずに独自のモデル構造を作ることが可能です。 またSymfony2の場合はDependency Injection(DI)があるため、オブジェクト同士の依存を解決するのも簡単になります。

例えばCakePHPを使っていた場合で、モデルとモデルの共通の処理が多くなってきた時に、Behavior以外にもvendorディレクトリ以下にクラスを作ったり、Libディレクトリにクラス作り、共通な処理をそこに逃がすようなアプローチを取ることが多いと思います。 そうなってしまうと様々なオブジェクトが密接に絡み合ってしまい生成をすることが大変になってしまい、「AというオブジェクトにはBというオブジェクトが必要で、Bというオブジェクトを使うにはCというオブジェクトが必要で…」みたいな事が発生してしまいます。 もちろん技術力の高いエンジニアならそのような事を回避する術を知っているかもしれませんが、私の場合そこまで良いコードを書くことは出来ません。

そのような状況でもSymfony2の場合だと、DIは非常に簡単にオブジェクト同士の依存を解決してくれます。

また、composerに対応していた事や、サードパーティのライブラリの非常に利用しやすい構造になっていたので、そこも採用に至った一つの理由になるかと思います。

Bundleに関して

Bundleとは
「バンドルとは、アプリケーションで実装する何らかの機能に関連するあらゆるものを格納する、単なるディレクトリ構造です。」
という説明がユーザー会のサイトに載っていますが、簡単に言ってしまうとパッケージと同じだと思います。

Symfony2の場合様々んBundleが公開されていて、それをうまく活用しながらより簡単にアプリケーションを作ることができます。
弊社では主に以下のバンドルを使用しています。

  • KnpPaginatorBundle
  • StofDoctrineExtensionsBundle
  • knpSnappyBundle
  • FOSRestBundle
  • FOSUserBundle
  • FOSJsroutingBundle
  • JMSserializerBundle
  • BCCResqueBundle

Editonについて

最初どのBundleを入れていいかわからない場合は「Edtion」を使うのもいいかもしれません。
Editonというのはそれぞれの用途で必要なBundleをまとめてくれた物です。

基本的にSymfony2を使うとなると、最初は「Symfony Standard Edition」を自然と使うことになりますが、他にも様々なEdtionがあります。
日本語のEdtionをまとめた記事は少ないんですが、唯一SymfonyのEditionまとめに詳しく載っているので気になる方はチェックしてみてください。

バージョン

Symfony2には他のフレームワーク同様に様々なバージョンがあります。
2014/12現在で一番新しいのが2.6.0になります。
弊社ではちょうど1年前程からSymfony2を導入したため、2.3系を使っています。LTS(long time support)なので、サポート期間も長いため、このバージョンを使用しています。

Symfony2はバージョンのメンテナンス期間がはっきりしています。
通常のバージョンは役8ヶ月程度、LTSは3年程度メンテナンスされます。
詳しくは「The Release Process」を確認してください。

学習コストについて

学習コストですが、Symfony2は非常に高いです。
ライブラリの使い方やお作法もあるんですが、Symfony2はちゃんと設計しないと(出来ないと)効果を発揮できません。
だからこそ設計の仕方やオブジェクト指向の原則なども学習した上で使うべきです。

私の場合オブジェクト指向??というように全然知識がなかったので相当苦しめられました。
サービスオブジェクトという言葉にも踊らされました。

そのような失敗から学んだ事として、以下の本をSymfony2以前に読んでおくことを勧めします。

  • アジャイルソフトウェア開発の奥義
  • エンタープライズ-アプリケーションアーキテクチャパターン
  • ドメイン駆動設計

導入のためのブログチュートリアル

しかし、そんな事よりもとにかくSymfony2を触ってみたい場合もあるかと思います。
その場合はBlogチュートリアルをやってみましょう。
ただしこれは、あくまでただのチュートリアルでSymfony2本来の良さがあまり出てこないので、この時点で他のフレームワークと比較しなくてもいいかと思います。
この程度なら、CakePHPのほうが優秀だと思うはずです。しかしそれは当たり前の事であり、Symfony2はもっと複雑なアプリケーションの場合に良い面が出てきます。

最後に

Symfony日本ユーザー会主催の勉強会やもくもく会が定期的に開催されているので、興味のある方は参加してみてください。
実際のプロダクトで使ってる話が聞けたり、わからないところを相談したり、みんなでディスカッションしたり出来ます。

ちなみにですが、11月30日は弊社でSymfonyもくもく会を開催しました。
今回はBEAR.Sundayの作者でもある@koriymさんにも参加していただきました。

Symfony2は個人で勉強するのは大変だと思いますが、チャレンジしてみる価値はあると思います。
PHPエンジニアとしてもっと成長したい人はRubyをやるよりも先にぜひSymfony2にチャレンジしてみてください!

おしまい。