要求
在某个用例中我们得到一个字符串......
StringX = "some value"
我们希望得到一个[Object A],其属性[Property X]与此字符串匹配。 如果没有[Object A]匹配该值,则需要创建它(因此标题为find或create)。
创建[对象A]的过程比仅仅向数据库添加条目更复杂。
问题
如果这只是找到我可以做的对象的问题:
$objectARepo = new ObjectARepository();
$objectA = $objectARepo->findByStringX($stringX);
但是,可能没有与StringX匹配的ObjectA,需要创建它。
我正在努力决定如何处理这种逻辑。
服务应该这样做吗?但服务不应该用于搜索对象,不是吗?
这样的事情会有意义吗?
$objectAService = new ObjectAService(new ObjectARepository());
$objectA = $objectAService->findOrCreateByStringX($stringX);
答案 0 :(得分:3)
如果找不到新的聚合,业务逻辑将需要创建新聚合并不常见,因为创建通常需要聚合的所有属性。而对于搜索,它只是其中的一小部分。
现在我们假设需要这样做。我建议它不应该是一个名为findOrCreate()的存储库函数,因为存储库应该只关心持久性而不关心如何创建对象。最好的地方是您调用存储库的服务(通常是应用程序服务)。
$objectA = $this->objectARepo->findByStringX($stringX);
$objectA = $objectA ?? $this->createNewObjectA($stringX);
$this->objectARepo->add($objectA);
createNewObjectA()将包含与为新创建的对象设置默认值相关的逻辑。如果您的聚合很复杂,您可以使用工厂。