Skip to content

About

Оверинженеринг выборки

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

API каталога товаров (DDD)

RESTful API для выборки товаров с поддержкой фильтрации и сортировки.
Проект реализован с использованием Domain-Driven Design (DDD) в попытке показать как из простой выборки данных, можно сделать оверинженерное решение)


Архитектура (DDD)

Проект разделён на чёткие слои в соответствии с принципами DDD:

app/
├── Domain/                 # Доменный слой — бизнес-логика
│   ├── Models/             # Чистые сущности (без зависимостей от фреймворка)
│   └── Repositories/       # Интерфейсы репозиториев
│
├── Application/            # Прикладной слой — use cases и DTO
│   ├── DTOs/               # Data Transfer Objects (например, фильтры)
│   ├── UseCases/           # Бизнес-сценарии (например, получение товаров)
|   └── Services/           # Управление логикой доменных сущностей
│
├── Infrastructure/         # Инфраструктурный слой — реализация
│   ├── Persistence/        # Работа с БД
│   │   └── Eloquent/       # Eloquent-модели и репозитории
│   ├── Http/               # Контроллеры и HTTP-обработчики
|	└── Repositories/       # Репозиторий 
│
└── Providers/              # Service providers (включая AppServiceProvider)

Быстрый старт

1. Клонирование

git clone git@github.com:LioneNET/Simple-DDD-Example.git
cd Simple-DDD-Example

2. Запуск окружения

Убедитесь, что у вас запущены Docker-контейнеры (обычно через docker-compose up -d).

Подключитесь к PHP-контейнеру:

docker exec -it laravel-php-fpm bash

3. Установка зависимостей

composer install

4. Настройка окружения

cp .env.example .env
php artisan key:generate

Отредактируйте .env, указав параметры подключения к PostgreSQL:

DB_CONNECTION=pgsql
DB_HOST=db
DB_PORT=5432
DB_DATABASE=my_base
DB_USERNAME=postgres
DB_PASSWORD=root

5. Миграции и тестовые данные

php artisan migrate
php artisan db:seed --class=CategoryProductSeeder

Сидер использует фабрики из database/factories/ и заполняет таблицы categories и products.


API

Endpoint

GET /api/products

Параметры запроса

Параметр Тип Описание
name string Поиск по частичному совпадению названия
in_stock bool Фильтр по наличию (1/0 или true/false)
price_from number Минимальная цена
price_to number Максимальная цена
category_id int ID категории
rating_from number Минимальный рейтинг
sort string Сортировка: price_asc, price_desc, rating_desc, newest

Пример

curl "http://localhost:8000/api/products?in_stock=true&price_from=1000&price_to=50000&sort=price_asc"

Ответ

[
  {
    "id": 3,
    "name": "Мышь беспроводная",
    "price": 1200,
    "category_id": 1,
    "in_stock": true,
    "rating": 4.2,
    "created_at": "10.01.2026",
    "updated_at": "12.01.2026"
  }
]

Технологии

  • Backend: Laravel 12+
  • Язык: PHP 8.3
  • База данных: PostgreSQL 14.9
  • Контейнеризация: Docker (через laravel-php-fpm и postgres)

Структура ключевых файлов

Назначение Путь
Доменная сущность товара app/Domain/Models/Product.php
Интерфейс репозитория app/Domain/Repositories/ProductRepositoryInterface.php
Use case app/Application/UseCases/GetFilteredProductsUseCase.php
DTO фильтра app/Application/DTOs/ProductFilterDTO.php
Eloquent-модель (инфраструктура) app/Infrastructure/Persistence/Eloquent/Models/ProductEloquent.php
Репозиторий (реализация) app/Infrastructure/Persistence/Eloquent/Repositories/EloquentProductRepository.php
Контроллер app/Infrastructure/Http/Controllers/Api/ProductController.php
Сидер database/seeders/CategoryProductSeeder.php
Фабрики database/factories/CategoryEloquentFactory.php, ProductEloquentFactory.php
Привязка интерфейсов app/Providers/AppServiceProvider.php

About

Оверинженеринг выборки

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages