更新: 09/02/2009 - 修订问题,提供更好的示例,增加赏金。
嗨,
我正在使用数据库和实体(域对象)之间的数据映射器模式构建一个 PHP 应用程序。我的问题是:
封装通常执行的任务的最佳方法是什么?
例如,一项常见任务是从站点映射器检索一个或多个站点实体,并从页面映射器检索它们的关联(主页)页面实体。目前,我会这样做:
$siteMapper = new Site_Mapper();
$site = $siteMapper->findByid(1);
$pageMapper = new Page_Mapper();
$site->addPage($pageMapper->findHome($site->getId()));
现在这是一个相当微不足道的例子,但实际上它变得更加复杂,因为每个站点也有一个关联的语言环境,并且页面实际上有多个修订版(尽管出于本任务的目的,我只对最近的一个感兴趣)。
我将需要在我的应用程序中的多个位置执行此操作(获取站点和关联的主页、区域设置等),并且我想不出封装此任务的最佳方式/位置,所以我不会必须到处重复。理想情况下,我希望得到这样的结果:
$someObject = new SomeClass();
$site = $someObject->someMethod(1); // or
$sites = $someObject->someOtherMethod();
生成的站点实体已创建关联实体并可供使用。
保存这些对象时也会出现同样的问题。假设我有一个站点实体和关联的主页实体,并且它们都已被修改,我必须执行以下操作:
$siteMapper->save($site);
$pageMapper->save($site->getHomePage());
同样,微不足道,但这个例子被简化了。重复代码仍然适用。
在我看来,拥有某种可以处理的中心对象是有意义的:
- 检索一个(或多个)站点和所有必要的关联实体
- 使用新的关联实体创建新的站点实体
- 获取一个(或多个站点)并保存它和所有关联实体(如果它们已更改)
所以回到我的问题,这个对象应该是什么?
- 现有的映射器对象?
- 基于存储库模式的东西?*
- 基于工作模式的东西?*
- 还有什么?
*正如您可能猜到的那样,我不完全理解其中任何一个。
有没有解决这个问题的标准方法,有人可以提供他们如何实现它的简短描述吗?我不是在寻找任何人来提供一个完全有效的实现,只是理论。
谢谢,
杰克