«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Простое руководство по доменно-ориентированному проектированию (DDD) в Laravel

Простое руководство по доменно-ориентированному проектированию (DDD) в Laravel

Опубликовано 8 ноября 2024 г.
Просматривать:143

A Simple Guide to Domain-Driven Design (DDD) in Laravel

Вы когда-нибудь чувствовали, что по мере роста вашего проекта Laravel ситуация начинает выходить из-под контроля? Контроллеры раздуваются, модели начинают выполнять слишком много задач, и внезапно ваша кодовая база становится похожа на тот ящик, который вы хотели организовать уже несколько месяцев. Именно здесь Domain-Driven Design (DDD) может вмешаться и облегчить вашу жизнь.

DDD — это способ разработки приложения таким образом, чтобы его структура точно соответствовала задаче, которую вы решаете в реальном мире. Это помогает сделать ваш код более чистым, масштабируемым и простым в управлении по мере роста вашего проекта.

В этом руководстве мы познакомим вас с основами DDD в Laravel, объясним, как его реализовать, и по ходу дела покажем несколько реальных примеров.

Оглавление

  1. Что такое предметно-ориентированное проектирование (DDD)?
  2. Зачем использовать DDD в Laravel?
  3. Компоненты DDD
    • Объекты
    • Объекты значений
    • Репозитории
    • Услуги
  4. Реализация DDD в Laravel
    • Пример 1. Построение системы управления заказами
    • Пример 2. Управление подписками пользователей
  5. Плюсы и минусы DDD в Laravel
  6. Заключительные мысли

Что такое доменно-ориентированное проектирование (DDD)?

Прежде чем мы углубимся в особенности Laravel, давайте рассмотрим, что такое Domain-Driven Design (DDD). DDD — это способ организовать код вашего приложения, сосредоточив внимание на бизнес-домене — основной проблеме, которую решает ваше программное обеспечение.

Вместо того, чтобы структурировать свой код на основе технических концепций, таких как контроллеры или модели, вы структурируете его на основе концепций реального мира. Это могут быть заказы, продукты или клиенты, в зависимости от того, что делает ваше приложение.

Короче говоря, DDD помогает вам создать приложение, отражающее реальные процессы, что упрощает понимание и поддержку кода, особенно по мере его роста.

Зачем использовать DDD в Laravel?

Если вы знакомы с шаблоном MVC (Модель-Представление-Контроллер), который Laravel использует по умолчанию, вы знаете, что он отлично работает для большинства приложений. Но по мере масштабирования вашего приложения шаблон MVC может привести к путанице взаимозависимого кода. Дизайн, ориентированный на предметную область решает эту проблему, упрощая расширение и поддержку вашего приложения с течением времени.

DDD также отделяет бизнес-логику от кода инфраструктуры. Это означает, что логика вашего приложения не будет привязана к таким вещам, как базы данных или API, что облегчит последующую замену технологий.

Компоненты DDD

Чтобы понять, как работает DDD, вам необходимо знать его ключевые компоненты. Давайте разберем их:

Сущности

Сущности — это объекты в вашем домене, имеющие отдельную идентичность. Например, заказ является сущностью, поскольку каждый заказ уникален.

// app/Domain/Order/Order.php
class Order {
    private $id;
    private $status;

    public function __construct($id, $status) {
        $this->id = $id;
        $this->status = $status;
    }

    // Getter and other business logic
}

Объекты значений

Объект значения — это объект, который не имеет идентификатора, но представляет собой концепцию. Например, объект Money представляет значение, но не требует уникального идентификатора.

// app/Domain/Order/Money.php
class Money {
    private $amount;
    private $currency;

    public function __construct($amount, $currency) {
        $this->amount = $amount;
        $this->currency = $currency;
    }

    public function getFormatted() {
        return "{$this->amount} {$this->currency}";
    }
}

Репозитории

Репозиторий обрабатывает выборку и сохранение объектов домена, таких как сущности. Вместо того, чтобы объекты вашего домена напрямую взаимодействовали с базой данных, доступом к данным управляют репозитории.

// app/Domain/Order/OrderRepositoryInterface.php
interface OrderRepositoryInterface {
    public function findById($id): ?Order;
    public function save(Order $order): void;
}

// app/Infrastructure/Order/EloquentOrderRepository.php
class EloquentOrderRepository implements OrderRepositoryInterface {
    public function findById($id): ?Order {
        // Fetch order using Eloquent
    }

    public function save(Order $order): void {
        // Save order using Eloquent
    }
}

Услуги

Сервис обрабатывает бизнес-логику, например создание заказа или обработку платежа. Вместо того, чтобы помещать эту логику в свои контроллеры, вы инкапсулируете ее в сервисы.

// app/Domain/Order/CreateOrderService.php
class CreateOrderService {
    public function execute($data) {
        $order = new Order($data['id'], $data['status']);
        // Business logic for creating an order
    }
}

Реализация DDD в Laravel

Теперь, когда вы понимаете ключевые компоненты, давайте посмотрим, как мы можем реализовать DDD в Laravel, на реальных примерах.

Пример 1. Создание системы управления заказами

Предположим, вы создаете Систему управления заказами для сайта электронной коммерции. Вот как DDD поможет вам организовать ваш код:

  1. Объекты: у вас будет объект Order, представляющий каждый заказ с такими атрибутами, как идентификатор и статус.
  2. Объекты значений: вы можете создать объект денежного значения для представления цен.
  3. Репозитории: вы должны создать OrderRepository для получения и хранения заказов в базе данных.
  4. Сервисы: CreateOrderService будет обрабатывать логику создания новых заказов.

Вот базовый порядок действий:

// app/Http/Controllers/OrderController.php
class OrderController {
    private $createOrderService;

    public function __construct(CreateOrderService $createOrderService) {
        $this->createOrderService = $createOrderService;
    }

    public function store(Request $request) {
        $this->createOrderService->execute($request->all());
        return response()->json(['message' => 'Order created!']);
    }
}

Пример 2. Управление подписками пользователей

Представьте, что вы управляете подписками пользователей на платформе SaaS. Используя DDD, вы создадите:

  • Субъект подписки, представляющий подписку каждого пользователя.
  • Объект значения продолжительности для управления периодами подписки.
  • Репозиторий подписок для управления доступом к данным.
  • Сервис SubscriptionService для обработки бизнес-логики, например продления подписки.

Вот как можно выполнить продление подписки:

// app/Domain/Subscription/RenewSubscriptionService.php
class RenewSubscriptionService {
    private $subscriptionRepository;

    public function __construct(SubscriptionRepositoryInterface $subscriptionRepository) {
        $this->subscriptionRepository = $subscriptionRepository;
    }

    public function renew($subscriptionId) {
        $subscription = $this->subscriptionRepository->findById($subscriptionId);
        $subscription->renew();
        $this->subscriptionRepository->save($subscription);
    }
}

Плюсы и минусы DDD в Laravel

Плюсы:

  • Лучшая организация: код четко структурирован в соответствии с предметной областью.
  • Масштабируемость: проще масштабировать большие приложения и управлять ими.
  • Удобство обслуживания: Бизнес-логика отделена от проблем инфраструктуры.

Минусы:

  • Кривая обучения: DDD представляет новые концепции, которые поначалу могут показаться ошеломляющими.
  • Накладные расходы для небольших проектов: реализация DDD для небольших и простых проектов может показаться излишним.

Заключительные мысли

DDD в Laravel может показаться сложной задачей, но как только вы начнете думать с точки зрения бизнес-доменов, а не технических уровней, это начнет обретать смысл. Все дело в том, чтобы ваш код был чистым, удобным в сопровождении и масштабируемым по мере роста вашего проекта.

Начните с малого. Выполните рефакторинг одной функции вашего приложения, используя принципы DDD, и посмотрите, как это будет выглядеть. Со временем вы начнете ценить организацию и ясность, которую она приносит.

Удачи и приятного программирования!

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/arafatweb/a-simple-guide-to-domain-driven-design-ddd-in-laravel-15cp?1 В случае нарушения прав обращайтесь по адресу Study_golang@163. .com, чтобы удалить его
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3