← Назад к вопросам

Что такое доменный слой?

1.8 Middle🔥 151 комментариев
#Архитектура и паттерны

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое доменный слой?

В контексте архитектуры программного обеспечения, особенно в подходах, таких как Domain-Driven Design (DDD), доменный слой (или слой предметной области) — это центральный компонент системы, который инкапсулирует ключевую бизнес-логику, правила и модели, отражающие реальную предметную область (домен), для которой создаётся приложение. Его главная цель — представить концепции, процессы и ограничения бизнеса в виде кода, оставаясь независимым от технических деталей (например, баз данных, внешних API или интерфейсов). В PHP-приложениях, особенно в сложных backend-системах, доменный слой является фундаментом, обеспечивающим чистоту бизнес-логики и её эволюцию без сильной привязки к инфраструктуре.

Ключевые характеристики доменного слоя

  • Бизнес-логика: Содержит правила, которые определяют, как данные могут изменяться и взаимодействовать (например, проверка лимита заказа, расчёт стоимости).
  • Независимость от инфраструктуры: Не зависит от баз данных (MySQL, PostgreSQL), фреймворков (Laravel, Symfony) или внешних сервисов. Это позволяет легко тестировать и изменять логику.
  • Модели предметной области: Включает сущности (Entity), объекты-значения (Value Objects), агрегаты (Aggregate) и сервисы домена (Domain Service), которые отражают ключевые концепции бизнеса.

Пример структуры доменного слоя в PHP

Рассмотрим упрощённый пример для системы управления заказами. Допустим, у нас есть сущность Order (заказ) и правило: "заказ не может быть создан, если сумма меньше 100 рублей".

<?php

// Пример сущности (Entity) в доменном слое
class Order
{
    private string $id;
    private int $amount;
    private string $status;
    private \DateTimeImmutable $createdAt;

    public function __construct(string $id, int $amount)
    {
        $this->id = $id;
        $this->setAmount($amount); // Применяем бизнес-правило
        $this->status = 'new';
        $this->createdAt = new \DateTimeImmutable();
    }

    // Бизнес-правило инкапсулировано внутри сущности
    private function setAmount(int $amount): void
    {
        if ($amount < 100) {
            throw new \DomainException('Сумма заказа должна быть не менее 100 рублей.');
        }
        $this->amount = $amount;
    }

    public function getId(): string
    {
        return $this->id;
    }

    public function getAmount(): int
    {
        return $this->amount;
    }

    // Другие методы, отражающие поведение заказа
    public function markAsPaid(): void
    {
        $this->status = 'paid';
    }
}
<?php

// Пример объекта-значения (Value Object) для представления денежной суммы
class Money
{
    private int $amountInCents;
    private string $currency;

    public function __construct(int $amountInCents, string $currency = 'RUB')
    {
        $this->amountInCents = $amountInCents;
        $this->currency = strtoupper($currency);
    }

    public function add(Money $other): Money
    {
        if ($this->currency !== $other->currency) {
            throw new \InvalidArgumentException('Валюты не совпадают');
        }
        return new self($this->amountInCents + $other->amountInCents, $this->currency);
    }
}

Почему доменный слой важен в PHP Backend?

  • Снижение связности: Отделяя бизнес-правила от фреймворка (например, Laravel) или базы данных (Eloquent), вы упрощаете поддержку и миграции.
  • Улучшение тестируемости: Доменный код можно тестировать юнит-тестами без поднятия базы данных или HTTP-сервера, что ускоряет разработку.
  • Фокус на бизнесе: Разработчики концентрируются на реальных требованиях, а не на технических деталях, что снижает ошибки.
  • Эволюция системы: При изменении внешних компонентов (например, переезд с REST на GraphQL) доменный слой остаётся стабильным.

Как доменный слой взаимодействует с другими слоями?

В типичной многослойной архитектуре (например, гексагональной или чистой архитектуре) доменный слой находится в центре и окружён:

  • Прикладным слоем (Application Layer): Оркестрирует вызовы доменных объектов, управляя транзакциями и координацией, но не содержа бизнес-логики.
  • Инфраструктурным слоем (Infrastructure Layer): Реализует технические детали, такие как репозитории для сохранения сущностей в базу данных или отправку уведомлений.

Пример взаимодействия:

  1. Контроллер (входной адаптер) получает запрос на создание заказа.
  2. Прикладной сервис вызывает доменную сущность Order для создания и проверки правил.
  3. Инфраструктурный репозиторий сохраняет заказ в базу данных.

Заключение

Доменный слой — это ядро backend-приложения на PHP, где живёт чистая бизнес-логика. Его правильное выделение позволяет строить масштабируемые, поддерживаемые и гибкие системы, которые легко адаптируются к изменениям в требованиях бизнеса. Внедрение DDD и акцент на доменном слое особенно полезны в проектах со сложной логикой, таких как финтех, e-commerce или корпоративные системы.

Что такое доменный слой? | PrepBro