Приклад застосування 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-схема (спрощена)

3 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарівУ 4 файлі `$items` це массив массивів з якимось даними. Зараз дійсно так хтось пише?
Domain depends on a third party :)
Наскільки бачу, це не DDD а звичайна шарова архітектура, т.к немає agregate root, шара доменних сервісів, тобто всі дії з ентіті повинни виконуватися на рівні ентіті. І взагалі до чого тут Ларавель, якщо все це отримуєте прямо з коробки в сімфоні, звичайно це можливо робити і там але це танці з бубном.