gcdtech/usecases

实现用例模式的基础类和接口,包括实体和实体生成迭代器。

2.0.0 2023-02-23 14:35 UTC

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接口,可用于分类参数和返回类型。