othercode / complex-heart
领域驱动设计工具。
v0.4.7
2023-01-10 14:08 UTC
Requires
- php: ^7.4|^8.0
- ext-json: *
- doctrine/instantiator: ^1.4
- illuminate/collections: ^8.20
- lambdish/phunctional: ^2.1
- nesbot/carbon: ^2.40
- ramsey/uuid: ^4.1
- spatie/data-transfer-object: ^2.6
Requires (Dev)
- fakerphp/faker: ^1.9.1
- mockery/mockery: ^1.4
- phpstan/phpstan: ^0.12.64
- phpunit/phpunit: ^9.3
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以获取更多详细示例。