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) | ||
関連エンティティの暗黙的ロード |
|
|
× | × | ||
関連エンティティの明示的ロード | クエリーで指定(Join) | クエリーで指定(with) | クエリーで指定(contain) | クエリーで指定(Include) | ||
埋め込みバリュー | ○ | △ | × | ○(ComplexType) | ||
トラッキング | ○ | × | × | ○ | ||
トラッキング指定 | エンティティ毎 | - | - | ロード毎 | ロード毎に指定できた方がパフォーマンスチューニングしやすい。 | |
POPO/POCO | ○ | × | × | ○ | 特定クラスを継承しなくても良いかどうか。 | |
アイデンティティ・マッピング | ○ | × | 不明 | ○ | ||
ドメインの構造 | 構造 |
|
|
|
||
バリデーション指定 | アノテーションまたは設定ファイル | 内部DSL | 内部DSL | 属性 | ||
ビュー | 標準テンプレート | twig | Blade | PHP | Razor | |
データ型変換 | ○ | ○ | 不明 | ○ | ||
マスター・ディテールフォーム | ○ | × | × | × | 標準的な枠組みが用意されているかどうか。 |