@naneri
PHP разработчик.

Так в чём преимущество паттерна репозиторий?

Часто читаю утверждение, что основное преимущество применения репозиториев - это возможность сменить одно хранилище на другое. Но количество кода которое надо изменять - все равно такое же. Просто вместо исправления в контроллерах приходится переписывать репозитории. Особенно это относится в случае частичной смены хранилищ для некоторых моделей (например если в приложении, в котором используется БД MySQL, решили вынести данные для личных сообщений, которых очень много, в другое более быстрое хранилище) приходится переписывать взаимодействие в этими моделями в каждом репозитории...

Или я где-то что-то не так понял?
  • Вопрос задан
  • 238 просмотров
Пригласить эксперта
Ответы на вопрос 1
@GoodBoy123
По сути репозиторий это более высокий уровень абстракции. При использовании репозитория вы программируете к интерфейсу, а не к реализации. На примере 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 не нужно, так как он работает с интерфейсом.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы