1 декабря 2025 г.

идеальная структура проекта на CodeIgniter 4.6 с разделением ответственности по слоям

 

1. CONTROLLER — только HTTP и передача данных

Задачи контроллера:

  • Принять запрос (GET/POST)

  • Создать DTO из запроса: RealEstateDTO::fromRequest($request)

  • Передать DTO в Service

  • Получить результат от Service

  • Передать данные в View

  • Никакой бизнес-логики, никаких where(), никаких запросов к модели

Контроллер — тонкий.


2. DTO — извлечение и валидация входных данных

Задачи DTO:

  • Прочитать входные данные из Request

  • Привести типы: string → int, пустое → null

  • Сформировать:

    • $filters

    • $sort

    • $pagination

    • $price_range

    • $city, $city_id

  • Создать эономические методы:

    • getFilters()

    • getSortOrders()

    • getPage()

    • getPerPage()

    • buildCanonicalUrl()

    • buildPriceRange()

DTO — фильтрация и нормализация данных + правила конвертации.
Никаких запросов к базе.


3. SERVICE — бизнес-логика

Задачи сервиса:

  • Принять DTO

  • Передать DTO → Filter → Repository

  • Выполнить бизнес-операции:

    • создание объекта

    • обновление объекта

    • сортировка

    • тумблеры (toggle)

    • привязка изображений

  • Конвертация DTO → entity → модель (insert/update)

Service — мозг приложения.


4. FILTER — подготовка query builder

Filter — это слой, который превращает DTO в SQL-запрос.

Задачи Filter:

  • Принять $dto->getFilters()

  • Применить:

    • where

    • like

    • between

    • orderBy

    • join

  • Поддержка:

    • $filter->where('city_id', 3)

    • $filter->orderBy('price','DESC')

    • $filter->paginate($page, $perPage)

Ничего не знает о Request, Service, Validation.

Filter — это SQL-конструктор.


5. MODEL — простая связь с конкретной таблицей

Задачи Model:

  • Точка входа в Query Builder

  • Описание таблицы

  • Soft deletes / timestamps

  • Методы:

    • getEntity($id)

    • isOwnedBy($id, $userId)

    • search()

  • Модель — это врата к базе, но не бизнес-логика.

Model — минимальная логика, только про таблицу.


6. REPOSITORY — доступ к данным

Repository — толстый слой для работы с базой.

Задачи Repository:

  • Выполнить Filter и Builder

  • Возвратить данные:

    • find

    • findAll

    • paginate

    • save/update

    • delete

  • Отвечает за работу со связями:

    • join cities

    • join users

    • eager loading (в будущем)

Repository — это слой, который заменяет работу с Model напрямую.

Слой Что делает Что не делает
Controller только request → DTO → service → view логика, SQL
DTO параметры, фильтры, сортировка, canonical SQL, бизнес-логика
Service операции над сущностями, вызывает Repository не обращается к Request
Filter строит SQL условие не знает о Request
Repository общение с Model и БД бизнес-правила
Model доступ к таблице, PK, timestamps бизнес-логика


Комментариев нет:

Отправить комментарий

Шаблонов для первых сообщений в интернет знакомствах

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