ドメイン駆動設計について質問があります。簡単なシナリオを想像してみましょう。
いくつかのプロパティを持つ「ユーザー」というエンティティがあります。これらのプロパティの 1 つは、"date_created"、"date_modified"、および "last_login_ip" です。
ユーザーを作成するフォームがあり、作成が成功すると、ユーザーを認証するとします。
- コントローラは POST データを取得します
- 「createAndAuthenticateUser」メソッドを介して投稿データを UsersService に送信します
- サービスはデータを受け取り、それを検証します (電子メールが既に存在するかどうかを検証するなど、検証はリポジトリに関連付けられているため、エンティティではなくここで行います)。
- 検証が OK の場合、新しいエンティティを作成し、それにデータを割り当ててから、エンティティをリポジトリに送信して保存します。その後、リポジトリはこのユーザーをデータソースに保存します。
ここまでは順調ですね。ここでの問題は、このサービス メソッドで date_created/date_modified/last_login_ip を設定する必要があることです。
ユーザー オブジェクトが更新されたときにいつでも date_modified を設定したい場合はどうすればよいでしょうか (たとえば、ログイン時に date_modified を更新したい、ユーザー更新時にもう一度更新したい、ユーザー作成時にもう一度更新したいなど)。
論理的には、私自身の答えは、これを次のようにリポジトリに配置することです...
(ここではメタコードのようなもので、構文は関係ありません)
function save($User) {
if (!$User->id) $User->date_created = 'YYYY-MM-DD HH:II:SS';
$User->date_modified = 'YYYY-MM-DD HH:II:SS';
$DataSource->Save($User);
return $User;
}
ただし、私が読んだことから、リポジトリは常に呼び出し元とデータソースの間でデータをマップする必要があります (およびその逆)、それだけです。SET データなどは絶対に使用しないでください。
もちろん、これはビヘイビアであると言うことができるので、date_modified プロパティを設定するだけの $User->markAsUpdated() というビヘイビアを持つことができます。しかし、繰り返しになりますが、これは、このメソッドを一元的に呼び出すのではなく、複数の場所から呼び出す必要があることを意味します。このコードがリポジトリにないことの利点はわかりません。
何か案は?