Паттерн репозиторий используется для изоляции логики хранения данных. Например:
interface UserRepository {
function getUser($id);
function getUsersWhichSatisfyMyCustomBuisnessRulecs(BuisnessRules $rules);
function saveUser(User $user);
}
class InMemoryUserRepository implements UserRepository {
private $users = [];
function getUser($id) {
return isset($this->users[$id]) ?
$this->users[$id] : null;
}
function getUsersWhichSatisfyMyCustomBuisnessRulecs(BuisnessRules $rules) {
return array_filter($this->users, function (User $user) use ($rules) {
return $user->isSatisfyRule($rules->getSomeRule());
}
}
function saveUser(User $user) {
$this->users[$user->getId()] = $user;
}
}
Что показывает данный пример:
- что репозиторий для приложения - это прежде всего интерфейс, имплементацию которого можно заменить в любой момент. Что позволяет нам менять хранилище для отдельных сущностей по желанию. Так же InMemoryRepository часто используют при юнит тестировании (хотя обычно это моки интерфейса).
- что нет жесткой привязки к реализации. Вы можете использовать внутри репозитория plain sql, data mapper, active record, ассоциативные массивы, файлы... ну вы поняли. Главное интерфейс заимплементить.
- репозиторий позволяет вам построить архитектуру приложения не связывая все с логикой хранения данных. Таким образом мы организуем слабую связанность системы и придерживаемся принципа единой ответственности.
martinfowler.com/eaaCatalog/repository.html