Symfony(PHP フレームワーク比較)

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

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

  • DoctrineにO/Rマッパーの機能が一通り揃っている。

  • 標準的なフォーム部品に相当するクラスが用意され、しかもカスタマイズしやすい。

  • データベース・ドメイン間、ドメイン・ビュー間の変換をカスタマイズしやすい。

  • フォームが階層構造に対応しているため、マスター・ディテールフォーム・部品表などのツリー構造を持つデータに容易に対応できる。

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

  • 学習コストが大きい。

  • DQLが使いにくい。

  • エンティティで関連を操作する際、参照が必要になるので回りくどい処理が必要になる場合がある。

  • エンティティがDIで生成されるので大量の行を操作すると処理が重い。

  • データベースからエンティティを生成する機能があるが、必ずしも適切なエンティティを生成しない。

  • 既定ではサブエンティティ(明細行)を保持する配列のキーとしてカラムの値が使われ、それがINPUT要素の名前の一部に使われ、文字によってはエラーになるので、これを回避しなければならない。

他のフレームワークと比較しました。Symfony のほか Laravel, ASP.NET5 の経験はありますが。 開発経験がない他のフレームワークはドキュメント等や各種Webサイトの情報を元に判断しました。

項目 Symfony 2.8
Laravel 9.6 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
データ型変換 不明
マスター・ディテールフォーム × × × 標準的な枠組みが用意されているかどうか。
参照