othercode/complex-heart

领域驱动设计工具。

v0.4.7 2023-01-10 14:08 UTC

This package is auto-updated.

Last update: 2024-09-11 14:57:12 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以获取更多详细示例。

参考资料