Подтвердить что ты не робот

DDD и MVC: разница между "моделью" и "сущностью"

Я серьезно запутался в концепции "Модели" в MVC. Большинство существующих в настоящее время фреймворков помещают модель между контроллером и базой данных, а модель почти действует как слой абстракции базы данных. Концепция "Fat Model Skinny Controller" теряется, поскольку контроллер начинает все больше и больше логики.

В DDD существует также понятие Domain Entity, которое имеет для него уникальный идентификатор. Насколько я понимаю, пользователь - хороший пример Entity (например, уникальный идентификатор пользователя). Сущность имеет жизненный цикл - значения могут меняться в течение всего действия, а затем сохраняются или отбрасываются.

Сущность, описанная выше, - это то, что я думал, что модель должна находиться в MVC? Как вне базы я?

Чтобы загромождать вещи больше, вы бросаете другие шаблоны, такие как шаблон репозитория (возможно, размещая там Сервис). Это довольно ясно, как Repository будет взаимодействовать с Entity - как это происходит с моделью?

Контроллеры могут иметь несколько моделей, что делает его похожим на модель, которая меньше "таблица базы данных", чем уникальная сущность.

ОБНОВЛЕНИЕ: В этом сообщении Модель описывается как что-то со знанием, и она может быть сингулярной или сбор объектов. Так что это больше похоже на сущность и модель, более или менее одинаковые. Модель является всеохватывающим термином, где сущность более конкретна. Объектом Value также будет модель. По крайней мере, с точки зрения 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;
        }
    }
}

Оба этих примера даже не делали то, что я описывал выше. Я явно потерян. Любой вход?

4b9b3361

Ответ 1

Entity

Entity означает объект, который является одним элементом, с которым работает бизнес-логика, а точнее те, которые имеют личность какого-то типа.
Таким образом, многие люди ссылаются на ORM-сопоставленные объекты как объекты.

Некоторые называют "сущность" классу, экземпляр которого представляет собой одну строку в базе данных.

Некоторые другие люди предпочитают вызывать только те из этих классов как "сущность", которые также содержат бизнес-правила, валидацию и общее поведение, а другие называют "объектами передачи данных".

Model

A Model - это то, что напрямую не связано с UI (= View) и потоком управления (= Controller) приложения, а скорее как способ доступа к данным и абстракции основных данных приложение работает.

В принципе, все может быть моделью, которая соответствует приведенному выше.

MVC

Вы можете использовать объекты в качестве моделей в MVC. Они означают две разные вещи, но одни и те же классы можно назвать обоими.

<сильные > Примеры

  • Класс Customer - это сущность (обычно), и вы также используете ее как часть доступа к данным в своем приложении. В этом случае это как объект, так и модель.
  • Класс Repository может быть частью Модели, но он явно не является сущностью.
  • Если есть класс, который вы используете в середине уровня бизнес-логики, но не подвергаете его остальной части приложения, это может быть объект, но он явно не является моделью с точки зрения MVC приложение.

Ваш пример

Что касается ваших примеров кода, я бы предпочел первый.
Модель - это класс, который используется как средство абстракции данных приложения, а не класс, который имеет имя, суффикс с "Моделью". Многие люди рассматривают последнюю вирусы.

Вы можете в значительной степени рассмотреть свой класс репозитория как часть вашей модели, даже если его имя не суффикс с "Моделью".

Я бы добавил, что тот факт, что также легче работать с первым, и для других людей, которым позже может понадобиться понять ваш код, легче понять.

Ответ 2

Все ответы - это тяжелый mashup разных вещей и просто неправильный.

Модель в DDD очень похожа на модель в реальном мире: Упрощение и абстракция чего-то. Не меньше и не больше. Он не имеет ничего общего с данными, объектами или чем-то еще. Это просто понятие доменной части. А также в каждом сложном домене всегда существует более одной модели, например. Торговля, выставление счетов, логистика.

Сущность не является "моделью с идентификатором", а просто объектом с идентификатором.

Репозиторий - это не только кеш 1-го уровня, но и часть домена. Это дает иллюзию объектов в памяти и отвечает за выборку Агрегаты (не сущности!) Из любого места и их сохранение т.е. поддержание жизненного цикла объектов.

Если вы говорите о концепциях DDD, сначала исправьте свои знания, прочитав основы. Как здесь ThinkDDD.

Ответ 3

"Модель" в вашем приложении - это бит, который хранит ваши данные. "Сущность" в доменном дизайне, если я правильно помню, представляет собой модель с идентификатором. Иными словами, сущность - это модель, которая обычно соответствует непосредственно "физическому" элементу в базе данных или файле. Я считаю, что DDD определяет два типа моделей: один - сущность, другой - значение, которое является просто моделью без и идентичности.

Шаблон репозитория - это всего лишь тип индексированного набора моделей/сущностей. Так, например, если ваш код хочет заказать номер 13, он сначала спросит у него репозиторий, и если он не сможет его получить, он отправится и доставит его откуда угодно. Это в основном кеш уровня 1, если хотите. Нет никакой разницы в том, как она действует с моделью, и как она действует с сущностью, но поскольку идея репозитория заключается в возможности извлечения моделей с использованием их идентификаторов, с точки зрения DDD, в хранилище.

Ответ 4

Простое решение, использующее сервис и сбор:

<?php
class MyController {
    public function index() {
        $postService = ServiceContainer::get('Post');
        $postCollection = $postService->findAllByDateRange('within 30 days');
        while($postCollection->getNext()) {
            echo $postCollection->current()->getAuthor();
        }
    }
}

EDIT: Модель (класс) представляет собой простое представление схемы сущности. Модель (объект) - это единое целое. Служба работает с моделями и предоставляет конкретные данные контроллеру s. Никакой контроллер не имеет модели. Модели автономны.
С другой стороны, карты отображают модели в уровни устойчивости (например, базы данных, сторонние бэкэнд и т.д.).