我們當前的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;
}
}
然後在這個版本中,集合對象會發出一個電話到存儲庫,它可以首先搜索它的緩存對象,然後只發出對數據庫的調用,以便在需要時加載記錄。