参考資料

Laravelでドメイン駆動設計(DDD)を実践し、Eloquent Model依存の設計から脱却する - Qiita

ユースケース

アプリケーションで実現したい、機能をユースケース図に書くか、「〇〇が■■する」という文章を箇条書きでまとめる

上記でまとめたユースケースをUseCase層として実装していく

UseCase実装のポイント

UseCaseはLaravelで言うとControllerに近い概念

UseCaseの引数にはValueObjectを渡すことがおすすめされている。

理由としては、引数にIDを渡すにしてもint型より、UserAccountIdのように独自の型を渡した方がより安全になる

Entity実装のポイント

コンストラクタをプライベートにする

コンストラクタを明示的にプライベートにすることが大事。

インスタンスが作られる方法を特定のメソッドのみに絞ることで、不整合なデータや、思わぬデータをデータベースから取得することを防ぐことができる

fainal class TodoEntity
{
	  private function __construct() {}

    // このメソッドを通してでしかインスタンスかできない
		public static function reconstructFromRepository(
				UserId $userId,
				TodoTitle $todoTitle
		): TodoEntity {
				$todo = new TodoEntity();
				$todo->userId = $userId;
				$todo->title = $todoTitle;

				return $todoEntity;
		}
 }

ValueObjectの実装ポイント

Entityと同様にコンストラクタをプライベートにする

理由はEntity同じ