premiervirtual/complex-heart

领域驱动设计工具。

v0.5.1 2023-11-27 23:39 UTC

README

Latest Stable Version License Tests codecov

关于

Complex Heart 的名称来源于 Eric Evans 的书籍《领域驱动设计:软件核心的复杂性处理》。本项目旨在提供一套有用的类和工具,以简化领域驱动设计在项目中的应用。

领域建模:聚合、实体和值对象

Complex Heart 允许您使用一组特性来建模领域聚合、实体和值对象。很好,但为什么是特性而不是类呢?嗯,有时您在类中有某种继承。被强制使用某个基类过于侵入性,而且我个人不喜欢。通过使用一组特性和接口,您将获得所需的所有功能,而不会损害您自身领域的本质。

让我们看一个非常基本的例子

use OtherCode\ComplexHeart\Domain\Contracts\ValueObject;
use OtherCode\ComplexHeart\Domain\Traits\IsValueObject;

/**
 * Class Color
 * @method string value()
 */
final class Color implements ValueObject 
{
    use IsValueObject;
    
    private string $value;
 
    public function __construct(string $value) {
        $this->initialize(['value' => $value]);
    }
    
    protected function invariantValueMustBeHexadecimal(): bool {
        return preg_match('/^#(?:[0-9a-fA-F]{3}){1,2}$/', $this->value) === 1;
    }
    
    public function __toString(): string {
        return $this->value();
    }
}

$red = new Color('#ff0000');
$red->equals(new Color('#00ff00')); // false
$red->value(); // #ff0000
$magenta = new Color('ff00ff'); // Exception InvariantViolation: Value must be hexadecimal.

要定义值对象,您只需要使用 IsValueObject 特性,这将允许您使用一些函数,如 equals(),它会自动比较对象的值,或者 initialize(),允许您对对象值运行不变性验证。可选的,也是推荐的,您可以使用 ValueObject 接口。

可用的特性有

  • HasAttributes 提供一些管理属性的功能。
  • HasEquality 提供处理对象之间相等性的功能。
  • HasInvariants 允许在实例化时进行不变性检查(守卫子句)。
  • HasIdentity 定义实体/聚合身份。
  • HasDomainEvents 提供领域事件管理。

在那些基本特性之上,Complex Heart 提供了一些现成的组合

  • IsModelHasAttributesHasInvariants 组成
  • IsValueObjectIsModelHasEquality 组成
  • IsEntityIsModelHasIdentityHasEquality 组成
  • IsAggregateIsEntityHasDomainEvents 组成

服务总线:命令、查询和事件

服务总线集成包含一些基本接口(ServiceBusCommandBusQueryBusEventBus)和构建在其上的类。

  • Message 基础 DTO,用于在层之间传输对象。
    • 请求
      • Command 命令 DTO。
      • Event 事件 DTO。
      • Query 查询 DTO。
    • 响应

查看这个使用示例

$response = $queryBus->ask(new GetUserQuery('some-uuid-value'));

查看 wiki 了解更多示例。

参考