gpt4 book ai didi

php - 了解域对象 + 数据映射器模式?

转载 作者:IT王子 更新时间:2023-10-29 01:22:01 26 4
gpt4 key购买 nike

我过去一直使用各种 ORM,并将我的所有逻辑放在我的模型中,而不管它的性质如何——SQL、MongoDB 查询甚至获取远程 JSON 对象。但是,当需要确保松耦合以允许高水平的可测试性时,这种方法的问题很快就会出现。

今天我读到了关于将模型分为两部分的内容,域对象数据映射器
如果我完全理解的话,Domain objects 完全不知道所使用的存储,而是为了处理业务逻辑而存在。另一方面,Data mappers 负责将 Domain objects 中的数据集存储到集合数据存储中。

不过,我确实发现很难在网上找到一个很好的、易于理解的示例,说明如何在真实示例中使用 DomainObjects 和 DataMappers。

这(下面显示的代码)是否是在我的代码中使用 DomainObjects 和 DataMappers 来存储用户的合适方式,还是我的头脑完全搞错了?

$user = new User_DO;
$userSave = new User_DM;
$userSave->store( $user->add(array('name' => 'John Doe')) );

class User_DO {

function add($array) {
if(!isset($array['name'])) {
throw new Exception("Name must be set");
}

return $array;

}

}

class User_DM {

function store($array) {
MyDatabase::execute("INSERT INTO...");
}

}

最佳答案

这背后的想法是拥有一个标准对象,它代表现实生活 或换句话说,在领域中的当前状态。这个领域模型通常是没有逻辑的数据集合。

class person_DO {
public $id;
public $firstname;
public $lastname;
public $addresses;
}

此域模型(域对象)实例的加载和持久性是通过数据映射器处理的 - 例如上述人员的地址可能通过 1:n 关系位于另一个表中,例如:

TABLE person {
id INTEGER PRIMARY KEY,
firstname VARCHAR(32),
lastname VARCHAR(32)
}

TABLE addresses {
id INTEGER PRIMARY KEY,
person_id INTEGER FOREIGN KEY ON person.id, --Reference on person-row
street VARCHAR(64),
...
}

person_DO 不需要知道这一点,但 datamapper 知道,因为它必须在加载期间聚合数据并在持久化期间分离:

class person_DM {
/**
* @param [integer] $id
* @return [person_DO] an instance of a person or null, if no person
* with that id was found.
*/
public function findById ($id) {...}

/**
* @return [array of person_DO]
*/
public function fetchAll() {...}

/**
* persists a person object
* @param [person_DO] an instance of a person
*/
public function saveOrUpdate(person_DO $person) {...}
}

为了进一步分离不同的部分,DataMappers 通常使用 DbTable Gateway 或类似的模式来允许使用不同的数据库或类似的操作。这样,我可以拥有多个具有相同模式的数据库,但是例如在不同的组织中用相同的代码构建数据仓库,只是数据库对象不同。

作为一个实际示例,我建议查看 Quickstart Tutorial Zend Framework 的功能,它的作用正是我刚才简要解释的。

关于php - 了解域对象 + 数据映射器模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6988111/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com