这背后的想法是有一个标准对象,它代表当前状态现实生活或者换句话说,在域中。这领域模型通常是没有逻辑的数据集合。
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 通常使用数据库表网关或类似的模式以允许使用不同的数据库或类似的操作。这样,我可以拥有多个具有相同模式的数据库,但是例如在不同的组织中用相同的代码构建数据仓库,只是数据库对象不同。
作为一个实际的例子,我建议看看快速入门教程 http://framework.zend.com/manual/1.12/en/learning.quickstart.htmlZend Framework 的功能,它的作用正是我刚才简要解释的。