DDD и MVC: разница между «моделью» и «сущностью»
Я серьезно озадачен концепцией «Модель» в MVC. Большинство существующих сегодня фреймворков помещают Модель между Контроллером и базой данных, а Модель почти действует как слой абстракции базы данных. Понятие «Толстый Тощий Контроллер Модели» утеряно, так как Контроллер начинает делать все больше и больше логики.
В DDD также существует концепция доменного объекта, который обладает уникальной идентичностью. Насколько я понимаю, пользователь - хороший пример сущности (например, уникальный идентификатор пользователя). У сущности есть жизненный цикл - его значения могут меняться в течение всего действия - и затем он сохраняется или удаляется.
Сущность, которую я описал выше, это то, что я думал, что Model должен быть в MVC? Насколько я вне базы?
Чтобы еще больше загромождать вещи, вы добавляете другие паттерны, такие как паттерн репозитория (возможно, размещая там Сервис). Довольно ясно, как хранилище будет взаимодействовать с сущностью - как это происходит с моделью?
Контроллеры могут иметь несколько Моделей, поэтому создается впечатление, что Модель - это не столько «таблица базы данных», сколько уникальная сущность.
ОБНОВИТЬ: В этом посте Модель описывается как нечто со знанием, и она может быть единичной или совокупностью объектов. Так что это звучит больше как сущность и модель более или менее одинаковы. Модель - это всеобъемлющий термин, в котором сущность является более конкретной. Объект значения также будет моделью. По крайней мере, с точки зрения MVC. Может быть???
Итак, в очень грубых выражениях, что лучше?
Никакая "Модель" действительно ...
class MyController {
public function index() {
$repo = new PostRepository();
$posts = $repo->findAllByDateRange('within 30 days');
foreach($posts as $post) {
echo $post->Author;
}
}
}
Или это, у которого есть Модель как DAO?
class MyController {
public function index() {
$model = new PostModel();
// maybe this returns a PostRepository?
$posts = $model->findAllByDateRange('within 30 days');
while($posts->getNext()) {
echo $posts->Post->Author;
}
}
}
Оба эти примера даже не делали то, что я описывал выше. Я явно потерян. Любой вклад?