RESTful API для выборки товаров с поддержкой фильтрации и сортировки.
Проект реализован с использованием Domain-Driven Design (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)
git clone git@github.com:LioneNET/Simple-DDD-Example.git
cd Simple-DDD-ExampleУбедитесь, что у вас запущены Docker-контейнеры (обычно через docker-compose up -d).
Подключитесь к PHP-контейнеру:
docker exec -it laravel-php-fpm bashcomposer installcp .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=rootphp artisan migrate
php artisan db:seed --class=CategoryProductSeederСидер использует фабрики из
database/factories/и заполняет таблицыcategoriesиproducts.
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 |