这背后的想法是有一个标准对象,它表示现实生活中或者换句话说,在域中的当前状态。这个域模型通常是没有逻辑的数据集合。
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不需要知道这一点,但是数据映射器,因为它必须在加载期间聚合数据,并在持久化期间分离:
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或类似的模式来允许使用不同的数据库或类似的动作。这样,我可以有几个数据库具有相同的模式,但例如。在不同的组织中构建一个具有相同代码的数据仓库,只有不同的数据库对象。
作为一个实际的例子,我建议看看Zend框架的Quickstart Tutorial,这正是我刚才解释的简单。