Где используется паттерн «Репозиторий»?
Паттерн репозиторий используется для изоляции логики хранения данных. Например: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
Вот вроди доступно расписано habrahabr.ru/post/248505