premiervirtual / complex-heart
领域驱动设计工具。
v0.5.1
2023-11-27 23:39 UTC
Requires
- php: ^8.1
- ext-json: *
- doctrine/instantiator: ^2.0
- lambdish/phunctional: ^2.1
- laravel/framework: ^10.33
- nesbot/carbon: ^2.71
- ramsey/uuid: ^4.7
- spatie/data-transfer-object: ^3.9
Requires (Dev)
- fakerphp/faker: ^v1.23
- mockery/mockery: ^1.6
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10.0
README
关于
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 提供了一些现成的组合
IsModel
由HasAttributes
和HasInvariants
组成IsValueObject
由IsModel
和HasEquality
组成IsEntity
由IsModel
、HasIdentity
和HasEquality
组成IsAggregate
由IsEntity
和HasDomainEvents
组成
服务总线:命令、查询和事件
服务总线集成包含一些基本接口(ServiceBus
、CommandBus
、QueryBus
和 EventBus
)和构建在其上的类。
Message
基础 DTO,用于在层之间传输对象。请求
Command
命令 DTO。Event
事件 DTO。Query
查询 DTO。
响应
查看这个使用示例
$response = $queryBus->ask(new GetUserQuery('some-uuid-value'));
查看 wiki 了解更多示例。