Проектирование api
Например, очень часто программисты любят запихивать данные одного функционала в один монолитный класс.
class Product |
---|
id |
title |
size |
price |
amount |
order |
class User |
---|
id |
name |
size |
desc |
active |
Нужно уходить от этого, и дробить это на независимые контексты, независимые сервисы.
Модульное разделение кода
Делим класс Product
на подклассы. В них будет информация которая нужна только для этого сервиса
Каждый модуль это не одна таблица или один класс, это может целый набор таблиц и классов
Склад |
---|
id - id товара |
amount - стоимость |
size - размер склада |
Бухгалтерия |
---|
id - id товара |
price - цена |
Заказ |
---|
id id товара |
amount - сколько заказали |
Каталог |
---|
id - id товара |
title - название |
description - описание |
photo - фото |
Доставка |
---|
id - id товара(артикул) |
size - размер |
weight - вес |
delivery - отдельная таблица |
user - phone, address, email |
Authentication |
---|
id - id user |
login - |
password - |
Comment |
---|
commentator - отдельная сущность id user = комментатор |
id - id комментария |
Получается, что эти вещи лучше делать отдельными модулями и хранить только ту информацию которая нужна модулю. Тогда мы не тащим всю таблицу User через весь проект, а выводим только ту инфу которая нужна.
Товар и пользователь при таком подходе хранится везде, а не в одной таблице.
Как это выглядит в коде
Модули могут называться следующем образом
- Author
- Blog
- Comment
- Data
- Favorite
- OAuth
- Payment
- Product
- HTTP
В каждом модуле лежит набор директорий с классами, к примеру:
Модуль words
работа со словами
Words
Entity - сущности
Word - название сущности
Word.php - класс сущности
WordRepository.php - репозиторий сущности
Command - команды
Word - название сущности
CreateWord - название команды
Command.php - класс команды
Handler.php - обработчик команды
Например, класс Command.php
. Это просто DTO.
<?php
declare(strict_types=1);
final class Command
{
public function __construct(
public string $name = '',
public string $description = ''
) {
}
}
Здесь самое важное, нужно строить структуру удобную в первую очередь нам!