本文目录导读:

在PHP中绘制上下文映射图(Context Map),通常会使用领域驱动设计(DDD)中的概念,下面我介绍几种主要的绘制方法和工具。
手绘方法(最常用)
基本元素
graph LR
A[限界上下文A] -->|通信关系| B[限界上下文B]
A -.->|事件驱动| C[限界上下文C]
A -.->|共享内核| D[限界上下文D]
关键标记
- 实线箭头:客户/供应商关系
- 虚线箭头:事件驱动或发布/订阅
- 双向箭头:共享内核或伙伴关系
- 线条+矩形:上下游关系
使用专业工具
PlantUML 示例
@startuml
!define BOUNDARY skinparam rectangle {
BackgroundColor lightblue
BorderColor blue
}
boundary "订单系统" as Order {
(下单)
(查询订单)
}
boundary "库存系统" as Inventory {
(库存查询)
(库存锁定)
}
Order -> Inventory : 锁定库存
Inventory --> Order : 库存不足通知
boundary "支付系统" as Payment {
(支付处理)
(退款)
}
Order -> Payment : 发起支付
Payment --> Order : 支付结果
@enduml
Mermaid.js 示例(Markdown友好)
graph TB
subgraph "用户管理上下文"
U1[用户注册]
U2[登录验证]
end
subgraph "订单上下文"
O1[创建订单]
O2[订单查询]
end
subgraph "支付上下文"
P1[支付处理]
P2[退款]
end
U1 --> O1
O1 --> P1
P1 --> O2
在线工具推荐
专业工具
- draw.io/diagrams.net:免费,支持团队协作
- Lucidchart:功能强大,有免费版
- Miro:在线白板,适合多人协作
代码生成工具
- PlantUML:文本生成图形
- Mermaid:Markdown友好
- Graphviz:灵活性强
PHP代码示例:生成上下文映射图
<?php
class ContextMapGenerator
{
private array $contexts = [];
private array $relations = [];
public function addContext(string $name, array $modules = []): void
{
$this->contexts[$name] = $modules;
}
public function addRelation(
string $from,
string $to,
string $type = 'upstream/downstream'
): void {
$this->relations[] = [
'from' => $from,
'to' => $to,
'type' => $type
];
}
public function generateMermaid(): string
{
$diagram = "graph TB\n";
// 生成上下文节点
foreach ($this->contexts as $name => $modules) {
$diagram .= " subgraph {$name}\n";
foreach ($modules as $index => $module) {
$diagram .= " {$name}_{$index}[{$module}]\n";
}
$diagram .= " end\n";
}
// 生成关系
foreach ($this->relations as $relation) {
$arrow = match($relation['type']) {
'event-driven' => '-.->',
'shared-kernel' => '<-->',
default => '-->'
};
$diagram .= " {$relation['from']} {$arrow} {$relation['to']}\n";
}
return $diagram;
}
}
// 使用示例
$map = new ContextMapGenerator();
$map->addContext('订单系统', ['创建订单', '订单查询', '订单管理']);
$map->addContext('库存系统', ['库存管理', '库存锁定', '库存预警']);
$map->addContext('支付系统', ['支付处理', '退款管理', '账务核对']);
$map->addRelation('订单系统', '库存系统', 'upstream/downstream');
$map->addRelation('订单系统', '支付系统', 'event-driven');
echo $map->generateMermaid();
最佳实践建议
- 保持简洁:每个上下文只显示核心模块(5-7个)
- 明确边界:使用颜色区分不同上下文
- 标注关系:清晰标注通信方式(REST、消息队列等)
- 版本控制:将图形源文件纳入版本管理
实际应用示例
graph TB
subgraph "用户上下文"
UC1[用户注册]
UC2[身份验证]
UC3[权限管理]
end
subgraph "商品上下文"
PC1[商品列表]
PC2[商品详情]
PC3[库存状态]
end
subgraph "订单上下文"
OC1[购物车]
OC2[下单流程]
OC3[订单追踪]
end
UC1 --> OC2
PC3 --> OC2
OC2 -.-> |MQ事件| UC3
选择哪种方式取决于你的具体需求:
- 团队协作:推荐使用在线工具如Miro
- 文档集成:使用Mermaid或PlantUML
- 代码驱动:编写生成脚本自动更新