slick/cqrs-tools

Slick/CQRS 是一个用于事件溯源风格应用的实用库。它包含一系列工具,可以加速领域驱动开发(DDD)和CQRS开发。

v0.6.1 2021-09-18 22:27 UTC

This package is auto-updated.

Last update: 2024-09-19 04:44:51 UTC


README

Latest Version on Packagist Software License Build Status Quality Score Total Downloads

Slick/CQRSTools 是一个用于事件溯源风格应用的实用库。它包含一系列工具,可以加速使用领域驱动开发(DDD)和CQRS技术进行开发。

此包符合PSR-2代码标准和PSR-4自动加载标准。它还遵循 语义版本2.0.0 规范。

安装

通过 Composer

$ composer require slick/cqrs-tools

使用方法

创建事件

事件是一种简单且描述性的记录某些操作的方式。它们通常包含一些元数据和用于更改领域值的值。考虑创建用户的事件

<?php

use Ramsey\Uuid\Uuid;
use Slick\CQRSTools\Event\AbstractEvent;
use Slick\CQRSTools\Event;

class UserWasCreated extends AbstractEvent implements Event
{
    /** @var Uuid */
    private $userId;
    
    /** @var string */
    private $name;
    
    public function __construct(Uuid $userId, string  $name)
    {
        parent::__construct();
        $this->userId = $userId;
        $this->name = $name;
    }
    
    public function jsonSerialize()
    {
        return [
            'userId' => $this->userId,
            'name' => $this->name    
        ];
    }
    
    public function unserializeEvent($data): void
    {
        $this->userId = Uuid::fromString($data->userId);
        $this->name = $data->name;
    }
    
}

上述类定义了一个 UserWasCreated 事件,并封装了创建用户的ID和名称。还有3个其他字段,考虑元数据,对于每个扩展 AbstractEvent 抽象类的事件: EventIdAuthorOccurredOn,分别持有唯一的标识ID、可选的作者(用户、服务等)ID以及事件发生的日期和时间。请注意,您需要实现 jsonSerialize()unserializeEvent() 方法。这些方法用于将事件发布到其他服务(如数据库或消息队列),以及从这些服务反序列化事件。元数据字段会自动序列化和反序列化,您不需要在那些方法中包含它们。

使用生成器记录事件

您的领域中的所有更改都应生成一个事件。因此,实现此功能的一种简单方法是将此类行为添加到您的领域对象中。考虑以下 User 对象

<?php

use Ramsey\Uuid\Uuid;

final class User
{
    /** @var Uuid */
    private $userId;
    
    /** @var string */
    private $name;
    
    public function __construct(string $name) {
        $this->name = $name;
        $this->userId = Uuid::uuid4();
    }
    
    public function userId(): Uuid
    {
        return $this->userId;
    }
    
    public function name(): string
    {
        return $this->name;
    }
}

这是一个非常简单的领域 User 实现示例。让我们假设每次创建用户时都应该创建一个 UserWasCreated 事件

<?php

use Ramsey\Uuid\Uuid;
use Slick\CQRSTools\Event\EventGenerator;
use Slick\CQRSTools\Event\EventGeneratorMethods;

final class User implements EventGenerator
{
    // ... other code
    
    use EventGeneratorMethods;
    
    public function __construct(string $name) {
        $this->name = $name;
        $this->userId = Uuid::uuid4();
        // Create the event
        $this->recordThat(new UserWasCreated($this->userId, $name));
    }
    
}

// 工作进行中...

变更日志

有关最近更改的更多信息,请参阅 CHANGELOG

测试

$ composer test

贡献

有关详细信息,请参阅 CONTRIBUTINGCODE_OF_CONDUCT

安全性

如果您发现任何安全问题,请通过电子邮件 slick.framework@gmail.com 而不是使用问题跟踪器。

致谢

许可

MIT 许可证(MIT)。有关更多信息,请参阅 许可文件