我们当前的ORM解决方案使用数据映射器来表示数据库中的表/视图,然后返回一个Collection对象,该对象可用于遍历检索到的记录作为Model对象。 Data Mapper和Model层之间是一个Repository层,它处理对数据映射器的域请求并返回相应的集合或域对象。如何正确执行类方法的正确使用?
我们目前正在研究重构Repository和Data Mapper层的职责,以便所有到Data Mapper层的应用程序请求通过Repository进行路由,Data Mapper将检索到的数据行返回到Repository,然后返回必要的收集到请求的对象。
我想知道的是,将整个Repository对象传递给相应的Data Mapper是否有效/好做法,以便我们只能通过Repository层强制访问Data Mapper。
举个例子,这基本上它是如何工作现在:
class DataMapper {
public function findAll(Criteria $criteria)
{
$select = $criteria->getSelect();
// Build specific select statement
$rows = $this->_fetchAll($select);
return new Collection(array('data' => $rows, 'mapper' => get_class($this)));
}
}
我想这样做是这样的:
class Repository {
public function findAllByName(Model $model)
{
$this->_criteria->addCondition('name LIKE ?', $model->name);
$rows = $this->_mapper->findAll($this);
return new Collection(array('data' => $rows, 'repository' => get_class($this)));
}
}
class DataMapper {
public function findAll(Repository $repository)
{
$select = $repository->getCriteria()->getSelect();
// Build specific select statement
$rows = $this->_fetchAll($select);
return $rows;
}
}
然后在这个版本中,集合对象会发出一个电话到存储库,它可以首先搜索它的缓存对象,然后只发出对数据库的调用,以便在需要时加载记录。