Правильная архитектура моделей Yii2?

Все привет и хороших наступающих выходных! (на карантине :D)
Однако не могу не задать вопрос.

Вопрос в правильном построении иерархии моделей (объект работы с таблицей). Есть раздел common/models и есть frontend/models. Я выстраивал их так. Допустим есть какой нибудь раздел ну пусть это будет раздел Договора, у него есть своя таблица в базе и естественно созданная модель-объект для работы с ней - Registry. В данном случае расположение её будет по пути /frontend/models/Registry(папка)/Registry. Тоесть находясь в разделе договоров, мы работаем с этой моделью.

Но вот пришло время в каком нибудь другом месте сайта, к примеру в разделе Отчеты обратиться ИЛИ даже поработать с таблицей договоров (обычно к примеру подсчитать кол-во договоров за месяц). Вот тут вопрос, как лучше сделать, подключать модель Registry из раздела договоров, тоесть - /frontend/models/Registry(папка)/Registry или же создавать отдельную модель в разделе Отчетов (frontend\models\Reports\Registry) ?

Просто в данный момент я так и делал, но со временем забываешь по абсолютно естественным причинам где какая модель подключена. И при изменении в модели летит система везде где она подключена.

Я сейчас решил сделать так: создать скажем так общую модель в разделе common\models\Registry. В ней только выборка и будет находиться функции к примеру подсчетов или определенных выборок БЕЗ записи в базу, только выборка.

И подключать эту модель уже в тех местах где нужно, на примере выше в разделе Отчеты подключу уже модель так /common/models/Registry.

Правильно ли я делаю?
  • Вопрос задан
  • 433 просмотра
Решения вопроса 1
myks92
@myks92 Куратор тега Yii
Нашёл решение — пометь вопрос ответом!
Model – это весь доменный слой (Domain Model). Доменный слой работает только с доменной логикой. В доменный слой входит не только модель Active Record, но и другие классы, например сервисы. В Yii2 принято называть моделью то, что наследуется от класса Model. Но сами модели в действительности являются сущностями (Entity). Разберитесь с этим.

При таком понимании разделении в вашей Модели должна быть логика только относящиеся к доменному слою. На примере CRUD это CUD. При этом раздел (модуль) должен работать только со своим модулем и не должен работать с другими модулями на прямую, но он может иметь слабую связь, например, через контроллеры.

Для чтения данных мы можем выделить ReadModel. Она может выдавать данные в виде массивов которые получают из SQL запросов, QueryBuider или AR. На примере CRUD это R. В итоге мы имеем чистый доменный слой, а другие слои могут быть связаны друг с другом в модулях.

Пример такой архитектуры можно посмотреть тут.

Мои ответы на схожую тему:
1. Архитектура приложения. Как сделать независимые модули (сервисы)?
2. Смысл модулей в Yii2?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы