Шаблон проектирования “Репозиторий” (Repository Pattern) — это способ организации кода, который помогает отделить логику работы с данными от остальной части приложения. Это позволяет сделать код более чистым, удобным для тестирования и легким в поддержке.
Простой пример из реальной жизни
Представьте, что у вас есть библиотека, и вы хотите управлять книгами. У вас есть книги, которые вы можете добавлять, удалять и искать. Вместо того чтобы каждый раз обращаться к полкам библиотеки (где хранятся книги), вы создаете специального человека — библиотекаря, который будет заниматься всеми вопросами, связанными с книгами. Библиотекарь знает, где находятся книги, как их найти и как с ними работать.
Как это выглядит в коде на PHP
- Создаем интерфейс репозитория:
interface BookRepositoryInterface {
public function add(Book $book);
public function remove(Book $book);
public function find($id);
public function findAll();
}
- Реализуем репозиторий:
class BookRepository implements BookRepositoryInterface {
private $books = [];
public function add(Book $book) {
$this->books[$book->getId()] = $book;
}
public function remove(Book $book) {
unset($this->books[$book->getId()]);
}
public function find($id) {
return $this->books[$id] ?? null;
}
public function findAll() {
return $this->books;
}
}
- Создаем класс книги:
class Book {
private $id;
private $title;
public function __construct($id, $title) {
$this->id = $id;
$this->title = $title;
}
public function getId() {
return $this->id;
}
public function getTitle() {
return $this->title;
}
}
- Используем репозиторий:
$bookRepository = new BookRepository();
$book1 = new Book(1, "1984");
$book2 = new Book(2, "Brave New World");
$bookRepository->add($book1);
$bookRepository->add($book2);
// Найти книгу по ID
$foundBook = $bookRepository->find(1);
echo $foundBook->getTitle();
$allBooks = $bookRepository->findAll();
foreach ($allBooks as $book) {
echo $book->getTitle() . "\n";
}
Почему это полезно?
- Отделение логики: Логика работы с книгами (добавление, удаление, поиск) отделена от остальной части приложения.
- Упрощение тестирования: Вы можете легко тестировать репозиторий, подменяя его на заглушки или моки(Stubs и Mocks).
- Удобство изменения: Если вам нужно изменить способ хранения книг (например, использовать базу данных вместо массива), вы можете сделать это в репозитории, не затрагивая остальной код.
Таким образом, шаблон “Репозиторий” помогает организовать код и сделать его более управляемым.
Еще почитать:
https://gist.github.com/maestrow/594fd9aee859c809b043
Еще посмотреть:
https://youtu.be/Y-GxEsNiIGU?si=14gzZ5jLfNiHKVhh