Skip to content

DDD 架构

MineShop 采用领域驱动设计(DDD)架构,将业务逻辑与技术实现分离,提高代码的可维护性和可扩展性。

🎯 架构概览

┌─────────────────────────────────────────────────────────────┐
│                    Interface 接口层                          │
│              Controller、Request、Response                   │
├─────────────────────────────────────────────────────────────┤
│                   Application 应用层                         │
│              AppService、DTO、Assembler                      │
├─────────────────────────────────────────────────────────────┤
│                     Domain 领域层                            │
│         Entity、Service、Repository、ValueObject             │
├─────────────────────────────────────────────────────────────┤
│                  Infrastructure 基础设施层                    │
│              Model、Cache、Queue、External                   │
└─────────────────────────────────────────────────────────────┘

📁 目录结构

app/
├── Interface/              # 接口层
│   ├── Admin/              # 后台接口
│   │   └── Controller/
│   └── Api/                # 前端接口
│       └── Controller/
├── Application/            # 应用层
│   ├── Admin/              # 后台应用服务
│   │   ├── Order/
│   │   │   ├── AppOrderCommandService.php
│   │   │   ├── AppOrderQueryService.php
│   │   │   └── Dto/
│   │   └── ...
│   └── Api/                # 前端应用服务
├── Domain/                 # 领域层
│   ├── Trade/              # 交易领域
│   │   ├── Order/
│   │   │   ├── Entity/
│   │   │   ├── Service/
│   │   │   ├── Repository/
│   │   │   ├── Contract/
│   │   │   └── ValueObject/
│   │   └── ...
│   └── ...
└── Infrastructure/         # 基础设施层
    ├── Model/
    ├── Abstract/
    └── ...

🔄 数据流转

Controller → AppService → DomainService → Repository → Model
    ↓            ↓             ↓              ↓
 Request       DTO         Entity         Database

1. 接口层 → 应用层

php
// Controller
public function create(CreateOrderRequest $request): ResponseInterface
{
    $dto = new CreateOrderDto($request->validated());
    $order = $this->appOrderService->create($dto);
    return $this->success($order);
}

2. 应用层 → 领域层

php
// AppOrderCommandService
public function create(CreateOrderDto $dto): Order
{
    // DTO → Entity(通过 Mapper)
    $entity = OrderMapper::fromDto($dto);
    
    // 调用领域服务
    return $this->domainOrderService->create($entity);
}

3. 领域层处理

php
// DomainOrderService
public function create(OrderEntity $entity): Order
{
    // 业务规则校验
    $entity->validate();
    
    // 库存扣减
    $this->stockService->reserve($entity->getItems());
    
    // 持久化
    return $this->repository->save($entity);
}

📦 核心概念

Entity(实体)

php
// OrderEntity.php
class OrderEntity
{
    private int $id;
    private string $orderNo;
    private OrderStatus $status;
    private array $items;
    
    public function cancel(): void
    {
        if (!$this->canBeCancelled()) {
            throw new BusinessException('订单无法取消');
        }
        $this->status = OrderStatus::CANCELLED;
    }
}

ValueObject(值对象)

php
// Money.php
final class Money
{
    public function __construct(
        public readonly int $amount,
        public readonly string $currency = 'CNY'
    ) {}
    
    public function add(Money $other): Money
    {
        return new Money($this->amount + $other->amount);
    }
}

Repository(仓储)

php
// OrderRepository.php
interface OrderRepositoryInterface
{
    public function findById(int $id): ?OrderEntity;
    public function save(OrderEntity $entity): Order;
    public function delete(int $id): bool;
}

Mapper(映射器)

php
// OrderMapper.php
class OrderMapper
{
    public static function fromDto(CreateOrderDto $dto): OrderEntity
    {
        return new OrderEntity(
            memberId: $dto->memberId,
            items: $dto->items,
            // ...
        );
    }
    
    public static function fromModel(Order $model): OrderEntity
    {
        return new OrderEntity(
            id: $model->id,
            orderNo: $model->order_no,
            // ...
        );
    }
}

✅ 设计原则

  1. 领域服务只接受实体: DTO → Entity 转换在应用层完成
  2. 实体封装业务规则: 状态变更、校验逻辑在实体内部
  3. 仓储抽象数据访问: 领域层不依赖具体数据库实现
  4. 值对象不可变: 值对象创建后不可修改

📚 相关文档

基于 Apache-2.0 许可发布 | 感谢 MineAdmin 提供的优秀基础框架