编程

使用 Spatie Event Sourcing 创建事件溯源域

78 2025-03-01 13:09:00

事件溯源(Event Sourcing)是一种跟踪应用状态变化的强大模式,为 Laravel 中管理域名驱动设计提供了一种健壮的方法。然而,设置事件溯源域名可能既费时又重复,尤其是在遵循最佳实践时。

为了简化这个过程,Alberto Arena 创建了一个 Laravel 包,它使用 Spatie 的事件溯源库自动创建事件溯源域。只需一个 artisan 命令,你就可以生成域所需的所有样板代码,包括聚合、事件和投射器。

此软件包使开发人员能够专注于他们的业务逻辑,而不是将时间花在重复的设置任务上。无论是在构建金融系统、审计跟踪,还是需要详细状态跟踪的复杂应用,此软件包都可以帮助你更快、更轻松地开始。

下面让我们先睹为快,看看它的使用有多简单:

php artisan make:event-sourcing-domain MODEL --domain=DOMAIN

本文中,我将指导你如何使用这个包,解释它的关键功能,并提供实际例子来帮助你有效地将事件溯源代码集成到 Laravel 项目中。

👉 GitHub 上查看源码!

理解该命令

该包提供的主命令为:

php artisan make:event-sourcing-domain MODEL --domain=DOMAIN

该命令为 Laravel 项目中的完整事件源域生成必要的结构和文件。让我们把它分解一下:

参数

  1. MODEL:
  • 该参数表示你的域的核心实体或者聚合根。
  • 示例:如果你在创建电商应用,模型(MODEL)可能是 Order、Product 或 Customer。
  1. --domain=DOMAIN:
  • 该参数定义了模型操作所在的域或者限界上下文。
  • 示例:对于 Order 模型,你可能会将其放入 Sales 或 Inventory 这样的域中。

命令用法

下例展示了如何使用该命令:

php artisan make:event-sourcing-domain Order --domain=Sales

运行该命令将生产下列文件结构:

app/
└── Domain/
    └── Sales/
        ├── Actions/
        │   ├── CreateOrder.php
        │   ├── DeleteOrder.php
        │   └── UpdateOrder.php
        ├── Aggregates/
        │   └── OrderAggregate.php
        ├── Events/
        │   ├── OrderCreated.php
        │   ├── OrderDeleted.php
        │   └── OrderUpdated.php
        ├── Projections/
        │   └── Order.php
        └──Projectors/
           └── OrderProjector.php

流程示例

为了演示该包的能力,我们来看看在 Laravel 应用的 Sales 域中设置一个用于管理订单(Order)的域的示例。

我们假设迁移已经存在。

// database/migrations/2024_12_20_121314_create_orders_table.php
return new class extends Migration
{
    **
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('orders', function (Blueprint $table) {
            $table->uuid()->primary();
            $table->string('customer_email')->index();
            $table->string('customer_name');
            $table->string('status')->default('pending');
            $table->decimal('total_amount', 10, 2);
            $table->json('items');
            $table->timestamps();
        });
    }

    // etc.
};

第 1 步: 生成事件溯源域

运行 make:event-sourcing-domain 命令:

php artisan make:event-sourcing-domain Order \
  --domain=Sales \
  --aggregate=1

运行此命令将生成如下结构:

app/
└── Domain/
    └── Sales/
        ├── Aggregates/
        │   └── OrderAggregate.php
        ├── DataTrasnferObjects/
        │   └── OrderData.php
        ├── Events/
        │   ├── OrderCreated.php
        │   ├── OrderUpdated.php
        │   └── OrderDeleted.php
        ├── Projections/
        │   └── Order.php
        └── Projectors/
            └── OrderProjector.php

第 2 步: 使用

use App\Domain\Sales\Actions\CreateOrder;
use App\Domain\Sales\DataTransferObjects\OrderData;
use App\Domain\Sales\Projections\Order;

# This will create a record in 'orders' table, using projector OrderProjector
(new CreateOrder)(new OrderData(
  customer_email: 'john@acme.org',
  customer_name: 'John Doe',
  total_amount: 110.2,
  items: [
    [
      'id' => 12345, 'name' => 'Whiskey bottle', 'quantity' => 2, 'price' => 55.1,
    ]
  ],
));

# Retrieve record
$order = Order::query()->where('email', 'john@acme.org')->first();

高级示例

生成 PHPUnit 测试

另一个有趣的特性是它可以为模型生成自动 PHPUnit 测试:

运行 make:event-sourcing-domain 命令:

php artisan make:event-sourcing-domain Order \
  --domain=Sales --unit-test

生成通知

该包允许使用选项生成通知(mail、Slack 和 Teams)。

请运行 make:event-sourcing-domain 命令:

php artisan make:event-sourcing-domain Order \
  --domain=Sales \
  --aggregate=1 \
  --notifications=mail,slack

运行该命令经生成如下文件结构:

app/
└── Domain/
    └── Sales/
        ├── Aggregates/
        │   └── OrderAggregate.php
        ├── DataTrasnferObjects/
        │   └── OrderData.php
        ├── Events/
        │   ├── OrderCreated.php
        │   ├── OrderUpdated.php
        │   └── OrderDeleted.php
        ├── Notifications/
        │   ├── Concerns/
        │   │   └── HasDataAsArray
        │   ├── OrderCreated.php
        │   ├── OrderUpdated.php
        │   └── OrderDeleted.php
        ├── Projections/
        │   └── Order.php
        └── Projectors/
            └── OrderProjector.php

小结

事件溯源是一种变革性的方法,用于构建具有强大状态管理和清晰审计跟踪的应用。通过利用 Spatie 事件溯源库,结合此 Laravel 包,你可以大大减少设置事件源域所花费的时间,同时确保一致性和最佳实践。

只需一个 artisan 命令,你就可以为你的域生成所有必要的文件和结构,使能够专注于构建应用的独特方面。

如果你已经准备好简化你的开发工作流程并深入到事件源中,请立即尝试该软件包:

👉 GitHub 源码!