gcdtech / usecases
实现用例模式的基础类和接口,包括实体和实体生成迭代器。
Requires
- php: ^8.0.0
- psr/container: ^1.0.0
This package is auto-updated.
Last update: 2024-09-23 17:49:44 UTC
README
实现用例模式的基础类和接口,包括实体和实体生成迭代器。
UseCases
用例是一个单独的类,实现应用业务逻辑中的一个“用例”。它协调对应用程序状态的操纵以达到其目的。
关键目标
1. 兼容性
通过仅使用简单对象和原始类型作为参数和返回类型,您的应用程序用例将始终是您的业务逻辑的永久表示,转移到新语言或框架不应需要任何重大的重写。
2. 作为插件与框架集成
当用例需要与外部层交互时(例如,持久化状态更改),这始终应通过将框架功能包装为服务并将依赖项注入其中来实现。这确保了UseCases始终可以转移到新框架,并且与框架的互操作性可以轻松评估、重写和替换,而无需更改用例代码或测试。
3. 可测试性
由于用例仅处理纯和简单的PHP类,因此它们应该是100%可测试的,因此TDD应该是首选的开发方法。
4. 专注于单一任务
用例应专注于完成单一业务目标 - 例如创建发票。如果需要协调其他更改才能执行操作,可以通过调用其他用例来实现。
用例签名
通常,用例有一个名为'execute'的单个方法,它接受参数并返回响应值。它还可以通过构造函数注入服务依赖项。
class DispatchOrderUseCase extends UseCase { private $emailProvider; public function __construct(EmailProvider $email) { $this->emailProvider = $email; } public function execute(Order $order) { // ... Do something to despatch the order $this->emailProvider->send(new DispatchEmail($order)); } }
调用用例
用例不应在单元测试之外直接实例化。在生产代码中,静态create()方法确保使用DI容器注入依赖项。
// Note no mention of the EmailProvider here... DispatchOrderUseCase::create()->execute($order);
实体
实体是一个简单的POPO(Plain Old PHP Object),没有任何花哨的功能,它代表传递到和从用例中的数据。通常,实体可以被视为业务对象的模型。
此库定义了一个基础的Entity类,仅允许基本类型识别(例如,$arg instanceof Entity)
EntityEmittingIterator
ORM通常支持将集合表示为可迭代对象,按需创建对象,这是保持内存使用量尽可能低的良好实践。为了表示列表,我们提供了一个EntityEmittingIterator,它扩展了基础Iterator PHP接口,可用于分类参数和返回类型。