PHP で DDD(ドメイン駆動設計)をする案件でウェブフレームワークの選定を行いました。
フレームワーク選定にあたり、以下の方針を立てました。
- 実績のあるフレームワークから選定(Laravel か Symfony の2択としました)
- DDD が提唱している不変条件をモデルに実装出来ること
- フレームワークと戦わない(目的達成の為に Hack 等の小細工をしない)
- 人がレビュー等で注意するといった回避策で妥協しない
- なるべくシンプルにフレームワークを使う
本来、フレームワークはドメイン層に関心がなく DDD に制約を与えないはずです。
一方で DDD はドメイン層以外には具体的な実装方法を提示していません。
DDD をやるのにどのフレームワークを使ってもいいのでは?と思うのですが、実際にはそうではありませんでした。
フレームワークが採用している ORM によって DDD しやすいものと困難なものがあります。
FW | ORM | パターン | 調査結果 |
---|---|---|---|
Laravel | Eloquant | Active Record | 設定が無く簡単 モデルで constructor や public, private といったアクセス修飾子が自由に使えない モデルに不変条件の実装ができずDDDに不向き |
Symfony | Doctrine | Data Mapper | DBのテーブルカラムとモデル属性のマッピング設定が必要 モデルで constructor や public, private といったアクセス修飾子が自由に使える モデルに不変条件の実装ができてDDDに向いている |
上記表の結果から PHP での DDD 案件では Symfony を採用することに決定しました。
我々は Laravel をとても気に入っていたので、なかなか Laravel をあきらめる気にはなれませんでした。しかし、色々と調べたのですが良い方法は見つかりませんでした。Active Record でもうまくDDDやっているという方がいましたら、ぜひ、知見をお聞かせください。
参考情報
モデルでドメイン知識を表現するとは何か・・・不変条件について、とても分かりやすい記事です