Приклад застосування DDD підходу в розробці з прикладами для Laravel

🧠 DDD-приклад в Laravel

Сценарій: Користувач робить замовлення на товари.

1. Entity: Order

namespace App\Domain\Order\Entities;

use App\Domain\Order\ValueObjects\OrderId;
use App\Domain\Order\ValueObjects\OrderItem;
use Illuminate\Support\Collection;

class Order
{
    public function __construct(
        public OrderId $id,
        public int $userId,
        public Collection $items,
    ) {}

    public function totalAmount(): float
    {
        return $this->items->sum(fn(OrderItem $item) => $item->subtotal());
    }

    public function addItem(OrderItem $item): void
    {
        $this->items->push($item);
    }
}

2. Value Object: OrderItem

namespace App\Domain\Order\ValueObjects;

class OrderItem
{
    public function __construct(
        public int $productId,
        public int $quantity,
        public float $price,
    ) {}

    public function subtotal(): float
    {
        return $this->quantity * $this->price;
    }
}

3. Repository: OrderRepositoryInterface

namespace App\Domain\Order\Repositories;

use App\Domain\Order\Entities\Order;

interface OrderRepositoryInterface
{
    public function save(Order $order): void;
    public function findById(int $id): ?Order;
}

4. Application Service: PlaceOrderService

namespace App\Application\Services;

use App\Domain\Order\Entities\Order;
use App\Domain\Order\Repositories\OrderRepositoryInterface;
use App\Domain\Order\ValueObjects\OrderId;
use App\Domain\Order\ValueObjects\OrderItem;
use Illuminate\Support\Collection;

class PlaceOrderService
{
    public function __construct(
        private OrderRepositoryInterface $repository
    ) {}

    public function handle(int $userId, array $items): Order
    {
        $order = new Order(
            new OrderId(uniqid()), 
            $userId, 
            collect()
        );

        foreach ($items as $item) {
            $order->addItem(
                new OrderItem($item['product_id'], $item['quantity'], $item['price'])
            );
        }

        $this->repository->save($order);

        return $order;
    }
}

📘 UML-схема (спрощена)

DDD UML-схема

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось1
До обраногоВ обраному1
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

У 4 файлі `$items` це массив массивів з якимось даними. Зараз дійсно так хтось пише?

Domain depends on a third party :)

namespace App\Domain\Order\Entities;
use Illuminate\Support\Collection;

Наскільки бачу, це не DDD а звичайна шарова архітектура, т.к немає agregate root, шара доменних сервісів, тобто всі дії з ентіті повинни виконуватися на рівні ентіті. І взагалі до чого тут Ларавель, якщо все це отримуєте прямо з коробки в сімфоні, звичайно це можливо робити і там але це танці з бубном.

Підписатись на коментарі