我有一个使用Zend Framework的PHP MVC应用程序。如快速入门中所述,我在模型部分使用了3层:
该模型是UML设计的,完全独立于DB。
我的问题是:我不能有多个相同“实例/记录”的实例。
例如:例如,如果我获得id = 5的用户“ Chuck Norris”,这将创建一个新的模型实例,其成员将由数据映射器填充(数据映射器查询查询数据库的表数据网关)。然后,如果我将名称更改为“ Duck Norras”,则不要立即将其保存在数据库中,而是将同一用户重新加载到另一个变量中,那么我将遇到“同步”问题...(<记录”)
现在,我使用Multiton / Identity Map模式:像Singleton一样,但是多个实例由一个键索引(在我们的示例中为用户ID)。但这使我的发展非常复杂,我的测试也变得很复杂。
如何正确处理?
编辑
针对此评论:
如果我有“从X中选择*”,如何跳过获取已加载的记录?
您不能在查询本身中,但是可以在将行加载到实体对象中的逻辑中。用伪代码:
class Person {}
class PersonMapper {
protected $identity_map = array();
function load($row) {
if (!isset($this->identity_map[$row['id']])) {
$person = new Person();
foreach ($row as $key => $value) {
$person->$key = $value;
}
$this->identity_map[$row['id']] = $person;
}
return $this->identity_map[$row['id']];
}
}
class MappingIterator {
function __construct($resultset, $mapper) {
$this->resultset = $resultset;
$this->mapper = $mapper;
}
function next() {
$row = next($this->resultset);
if ($row) {
return $this->mapper->load($row);
}
}
}
实际上,您可能希望MappingIterator
实现Iterator
,但为了简洁起见,我跳过了它。
最佳选项,如果您想在项目中使用各种单例。
Iterator