使用 Spatie Event Sourcing 创建事件溯源域
事件溯源(Event Sourcing)是一种跟踪应用状态变化的强大模式,为 Laravel 中管理域名驱动设计提供了一种健壮的方法。然而,设置事件溯源域名可能既费时又重复,尤其是在遵循最佳实践时。
为了简化这个过程,Alberto Arena 创建了一个 Laravel 包,它使用 Spatie 的事件溯源库自动创建事件溯源域。只需一个 artisan 命令,你就可以生成域所需的所有样板代码,包括聚合、事件和投射器。
此软件包使开发人员能够专注于他们的业务逻辑,而不是将时间花在重复的设置任务上。无论是在构建金融系统、审计跟踪,还是需要详细状态跟踪的复杂应用,此软件包都可以帮助你更快、更轻松地开始。
下面让我们先睹为快,看看它的使用有多简单:
php artisan make:event-sourcing-domain MODEL --domain=DOMAIN
本文中,我将指导你如何使用这个包,解释它的关键功能,并提供实际例子来帮助你有效地将事件溯源代码集成到 Laravel 项目中。
理解该命令
该包提供的主命令为:
php artisan make:event-sourcing-domain MODEL --domain=DOMAIN
该命令为 Laravel 项目中的完整事件源域生成必要的结构和文件。让我们把它分解一下:
参数
MODEL
:
- 该参数表示你的域的核心实体或者聚合根。
- 示例:如果你在创建电商应用,模型(MODEL)可能是 Order、Product 或 Customer。
--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 命令,你就可以为你的域生成所有必要的文件和结构,使能够专注于构建应用的独特方面。
如果你已经准备好简化你的开发工作流程并深入到事件源中,请立即尝试该软件包: