我目前正在开发一个 php 框架,以抽象并使其有趣且易于使用我公司咨询的外部软件 ($ES)。我的方法是六边形设计模式,到目前为止效果很好。我唯一关心的是将实体从 $ES 映射(以及映射到哪里)到我们的内部结构。
示例:$externalSoftwareProduct(处理所有事情的神类)映射到 $internalFrameworkProduct(以及许多其他用于拆分职责的类)。这发生在存储库中。在每个存储库方法中,我从 $ES 收集这些实体并执行
new $internalFrameworkProduct(some arguments here coming from
$externalSoftwareProduct)
foreach 我收集的实体然后返回。在这些存储库中,只有通用方法,例如 getById、getAll,您可以命名它。
现在我们在客户项目中使用这个框架,并使用特定领域的扩展来扩展这些基类,比如 CustomerNameProductRepository。在那里,您可以找到特定领域的方法,例如 getProductsCustomerAlwaysNeeds 等。在这些方法的最后,我们将 $internalFrameworkProduct 映射到 $customerSpecificProduct ,它保存数据以便于访问,这是必需的。此特定存储库中的方法如下所示。
public function getProductsCustomerAlwaysNeeds()
{
$dataStuff = parent::getSomeStuff();
/** @var internalFrameworkProduct[] $products **/
$products = magic();
foreach($products as $product)
{
$customerProducts[] = $this->getCustomerSpecificProduct($product->getId());
}
return $customerProducts;
}
public function getCustomerSpecificProductById(int $productId)
{
$externalSoftwareProduct = new externalSoftwareProduct($productId)
$customerSpecificProduct = new CustomerSpecificProduct(some arguments here coming from $externalSoftwareProduct)
return $customerSpecificProduct;
}
现在到目前为止这工作正常。唯一的问题是单元测试。我们正在使用 phpunit + Mockery。为了模拟那些新创建的实例,我们必须使用 mock(overload:externalSoftwareProduct) 和 mock(overload: CustomerSpecificProduct) 这总是很痛苦(特别是如果您尝试使用多个实例进行测试,这是不时需要的) .
你会如何处理这个问题?必须有更好的方法来连接这 3 部分(externalSoftwareProduct、internalFrameworkProduct 和 CustomerSpecificProduct(它扩展了 internalFrameworkProduct))。
我正在考虑为 CustomerSpecificProduct 使用工厂,以便模拟工厂并让它吐出我的产品。但我觉得我过度设计了这样一个简单的任务。