Загрузка...

Шаблон проектирования “Репозиторий”

php

Шаблон проектирования “Репозиторий” (Repository Pattern) — это способ организации кода, который помогает отделить логику работы с данными от остальной части приложения. Это позволяет сделать код более чистым, удобным для тестирования и легким в поддержке.

Простой пример из реальной жизни

Представьте, что у вас есть библиотека, и вы хотите управлять книгами. У вас есть книги, которые вы можете добавлять, удалять и искать. Вместо того чтобы каждый раз обращаться к полкам библиотеки (где хранятся книги), вы создаете специального человека — библиотекаря, который будет заниматься всеми вопросами, связанными с книгами. Библиотекарь знает, где находятся книги, как их найти и как с ними работать.

Как это выглядит в коде на PHP

  1. Создаем интерфейс репозитория:

interface BookRepositoryInterface {
    public function add(Book $book);
    public function remove(Book $book);
    public function find($id);
    public function findAll();
}
  1. Реализуем репозиторий:

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;
    }
}
  1. Создаем класс книги:

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;
   }
}
  1. Используем репозиторий:

$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";
}

Почему это полезно?

  1. Отделение логики: Логика работы с книгами (добавление, удаление, поиск) отделена от остальной части приложения.
  2. Упрощение тестирования: Вы можете легко тестировать репозиторий, подменяя его на заглушки или моки(Stubs и Mocks).
  3. Удобство изменения: Если вам нужно изменить способ хранения книг (например, использовать базу данных вместо массива), вы можете сделать это в репозитории, не затрагивая остальной код.

Таким образом, шаблон “Репозиторий” помогает организовать код и сделать его более управляемым.

Еще почитать:
https://gist.github.com/maestrow/594fd9aee859c809b043

Еще посмотреть:
https://youtu.be/Y-GxEsNiIGU?si=14gzZ5jLfNiHKVhh

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *