phpでSymfonyを採用したシステムを開発しました。開発を通じて感じた利点・欠点を紹介します。

次の点が優れていると思いました。

  • DoctrineにO/Rマッパーの機能が一通り揃っている。
  • 標準的なフォーム部品に相当するクラスが用意され、しかもカスタマイズしやすい。
  • データベース・ドメイン間、ドメイン・ビュー間の変換をカスタマイズしやすい。
  • フォームが階層構造に対応しているため、マスター・ディテールフォーム・部品表などのツリー構造を持つデータに容易に対応できる

次のような点が不便と思いました。

  • 学習コストが大きい。
  • DQLが使いにくい。
  • エンティティで関連を操作する際、参照が必要になるので回りくどい処理が必要になる場合がある。
  • エンティティがDIで生成されるので大量の行を操作すると処理が重い。
  • データベースからエンティティを生成する機能があるが、必ずしも適切なエンティティを生成しない。
  • 既定ではサブエンティティ(明細行)を保持する配列のキーとしてカラムの値が使われ、それがINPUT要素の名前の一部に使われ、文字によってはエラーになるので、これを回避しなければならない。

他のフレームワークと比較しました。他のフレームワークは開発経験がないのでドキュメント等や各種Webサイトの情報を元に判断しました。

項目 Symfony 2.8
Laravel 5.1 CakePHP 3 ASP.NET Core 備考
O/Rマッピング コンポーネント Doctrine Eloquent 一体 EntityFramework  
問い合わせ言語
DQL(外部DSL)
QueryBuilder(内部DSL)
QueryBuilder(内部DSL) QueryBuilder(内部DSL) Linq(内部DSL)  
関連エンティティの暗黙的ロード
  • 遅延
  • 特殊遅延(行毎読み込み・Count関数発行)
  • 即時
  • 遅延
× ×
関連エンティティの明示的ロード クエリーで指定(Join) クエリーで指定(with) クエリーで指定(contain) クエリーで指定(Include)
埋め込みバリュー × × ○(ComplexType)  
トラッキング × ×
トラッキング指定 エンティティ毎 ロード毎 ロード毎に指定できた方がパフォーマンスチューニングしやすい。
POPO/POCO × × 特定クラスを継承しなくても良いかどうか。
アイデンティティ・マッピング 不明 不明  
ドメインの構造 構造
  • Entity
  • Repository
    (Finder+Updater)
  • EntityManager
    (Updater)
  • ActiveRecord
    (Entity+Finder+Updater)
  • ActiveRecord
    (Entity+Updater)
  • Table
    (Finder+Updater)
   
バリデーション指定 アノテーションまたは設定ファイル 内部DSL 内部DSL 属性
ビュー 標準テンプレート twig Blade PHP Razor
データ型変換 不明 不明  
マスター・ディテールフォーム × × × 標準的な枠組みが用意されているかどうか。