PHP上下文映射图怎么绘制

wen PHP项目 2

本文目录导读:

PHP上下文映射图怎么绘制

  1. 手绘方法(最常用)
  2. 使用专业工具
  3. 在线工具推荐
  4. PHP代码示例:生成上下文映射图
  5. 最佳实践建议
  6. 实际应用示例

在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();

最佳实践建议

  1. 保持简洁:每个上下文只显示核心模块(5-7个)
  2. 明确边界:使用颜色区分不同上下文
  3. 标注关系:清晰标注通信方式(REST、消息队列等)
  4. 版本控制:将图形源文件纳入版本管理

实际应用示例

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
  • 代码驱动:编写生成脚本自动更新

抱歉,评论功能暂时关闭!