域驱动设计 – PHP存储库模式实现问题

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了域驱动设计 – PHP存储库模式实现问题脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
存储库应该从服务调用返回什么?

例如,实体(或实体集合),或者是对自身的引用,然后可以用来访问包含实体集合的属性

拿这个示例代码

$user = $userReposITory->findById(1);

要么

$users = $userRepository->findAll();

我认为在大多数代码中,用户实体对象或用户集合实体将从这样的调用返回.

对我来说似乎有点奇怪,从一个方向来说,一个Repository会直接返回对象,但是从另一个方面来看,它会在对它们进行操作之前将它们保持在状态.以此示例代码为例

$user = $factory->;make('user');
$user->setName($array_data['name']);

$repo->add($user);
$repo->save();

这是怎么做的?

我认为我希望在检索方面看到更多这样的东西:

$users = $userRepository->findAll(); // Returns $userRepository reference

foreach($users->collection() as $user) {
    // Do some operations,or whatever
}

$users->save();

或者,对于只读需求:

$users = $userRepository->findAll();
$users = $users->collection(); // Returns User Entities held in state

澄清为什么以这种或那种方式完成它将非常感激.

工厂属于域内的哪个部门

它应该作为MapPEr对象的依赖注入吗?似乎还必须存在来自控制代码/服务层的工厂访问权限,用于创建要提交到存储库的实体.

这导致我的下一个问题……

从控制类/服务层创建新实体的首选方法是什么

我见过使用Factory对象,如下所示:

$user = $factory->make('user');
$user->setName($array_data['name']);

$repo->add($user);

以及内置的Repository方法,如下所示:

$repo->saveFromArray($array_data);

在第二个示例中,$array_data将通过存储库转发到Mapper,然后Mapper将执行保存.当然,在任一示例中,都将预先检查数据的重叠记录.

我假设第一种方法是首选?它似乎是一种更加面向对象的方法.

解决方法

你有很多问题……

始终聚合根(AR). AR设计非常重要,但它不是存储库的关注点.存储库方法根据域的需要返回一个或多个对象.没有Users Collection Enitity,有一个用户列表(在PHP中可能是一个数组),不要复杂化.

域存储库应仅用于域需求(读取或写入).返回整个对象,存储库不返回AR的片段,而是返回整个AR.我再次提到AR设计非常重要.

它需要的地方.我不使用工厂,最多我有一个工厂方法,但即使这是为了恢复目的(如果我使用纪念品).您不必使用工厂来创建域对象.

简单方法.对于大概99%的情况,您将使用“新”运算符.仅当工厂为特定实体提供具体利益时才使用工厂.

Mapper从不执行保存,因为它是一个映射器.只有存储库才能执行持久性工作. Mappers将数据从一个模型转换/复制到另一个模型.您可以使用映射器将域对象映射到某些数据模型以进行持久化和返回.

脚本宝典总结

以上是脚本宝典为你收集整理的域驱动设计 – PHP存储库模式实现问题全部内容,希望文章能够帮你解决域驱动设计 – PHP存储库模式实现问题所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。