域映射-将模型从外部软件转换为内部结构

时间:2018-09-11 08:19:49

标签: php architecture phpunit mockery hexagonal-architecture

我目前正在研究一个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。为了模拟这些新创建的实例,我们必须使用模拟(overload:externalSoftwareProduct)和模拟(overload:CustomerSpecificProduct),这总是很痛苦的(特别是如果您尝试使用多个实例进行测试,这是不时需要的)

您将如何处理?必须有更好的方法来连接这3个组件(externalSoftwareProduct,internalFrameworkProduct和CustomerSpecificProduct(扩展了internalFrameworkProduct))。

我当时正在考虑为CustomerSpecificProduct使用工厂,以便仅模拟工厂并让其吐出我的产品。但是我感觉自己过度设计了这么简单的任务。

1 个答案:

答案 0 :(得分:0)

«....将实体从$ ES映射(以及在何处映射)到我们的内部结构...»

在用于访问外部软件的适配器中。