Appearance
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 Database1. 接口层 → 应用层
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,
// ...
);
}
}✅ 设计原则
- 领域服务只接受实体: DTO → Entity 转换在应用层完成
- 实体封装业务规则: 状态变更、校验逻辑在实体内部
- 仓储抽象数据访问: 领域层不依赖具体数据库实现
- 值对象不可变: 值对象创建后不可修改