По сути репозиторий это более высокий уровень абстракции. При использовании репозитория вы программируете к интерфейсу, а не к реализации. На примере Laravel. У вас есть MessagesRepository:
interface MessagesRepository {
// Выбрать все сообщение
public function all();
// Выбрать сообщение по id
public function findById($id);
//Записать сообщение
public function store($id, $userId);
}
В остальном коде вы обращаетесь именно к этому интерфейсу используя IOC контейнер:
MessagesController.php
protected $messages;
public function __construct(MessagesRepository $messages){
$this->messages = $messages;
}
public function index() {
return view('messages.index')-with('messages', $this->messages->all());
}
После этого вы с помощью Laravel IOC контейнера связываете интерфейс с конкретной реализацией
$this->app->bind(
'App\Repositories\Messages\MessagesRepository',
'App\Repositories\Messages\MysqlMessagesRepository'
);
И в MysqlMessagesRepository уже делаете реализацию применяя интерфейс
class MysqlMessagesRepository implements MessagesRepository {
// Выбрать все сообщение
public function all() {
MysqlGetAllMessages();
}
// Выбрать сообщение по id
public function findById($id);
//Записать сообщение
public function store($id, $userId);
}
Преимущество в том что код работает с интерфейсом, а не с реализацией, поэтому для того, чтобы поменять Mysql на redis нужно:
создать реализацию MessagesRepository интерфейса
class RedisMessagesRepository implements MessagesRepository {
// Выбрать все сообщение
public function all() {
RedisGetAllMessages();
}
// Выбрать сообщение по id
public function findById($id);
//Записать сообщение
public function store($id, $userId);
}
Сказать IOC контейнеру, что нужно брать другую реализацию:
$this->app->bind(
'App\Repositories\Messages\MessagesRepository',
'App\Repositories\Messages\RedisMessagesRepository'
);
И на этом все. Менять код в MessagesController не нужно, так как он работает с интерфейсом.