В Symfony репозиторий представляет собой класс, отвечающий за взаимодействие с базой данных и выполнение запросов. Когда у нас есть несколько сущностей, которые должны быть сохранены в базе данных в похожем формате, мы можем столкнуться с проблемой двойного кода, то есть дублирования кода в различных репозиториях.
Чтобы избежать двойного кода в данном случае, мы можем использовать наследование и абстрактные классы. Создадим абстрактный репозиторий, который будет содержать общую логику для всех репозиториев. Затем каждый репозиторий будет наследоваться от этого абстрактного класса и добавлять свою уникальную логику.
Пример:
abstract class BaseRepository extends DoctrineORMEntityRepository { protected function findByCriteria(array $criteria): array { // общая логика для поиска по критериям } // общие методы для работы с базой данных } class UserRepository extends BaseRepository { public function findByEmail(string $email): ?User { // уникальная логика для поиска пользователя по email } // дополнительные методы для работы с пользователями } class OrderRepository extends BaseRepository { public function findByStatus(string $status): array { // уникальная логика для поиска заказов по статусу } // дополнительные методы для работы с заказами }
В этом примере абстрактный класс BaseRepository
содержит общую логику, например, метод для поиска сущностей по критериям. Он также может содержать общие методы для работы с базой данных, такие как сохранение, обновление и удаление.
Каждый конкретный репозиторий (UserRepository
, OrderRepository
) наследуется от BaseRepository
и добавляет свою уникальную логику, специфичную для работы с конкретной сущностью. Например, UserRepository
может иметь метод для поиска пользователей по email, а OrderRepository
может иметь метод для поиска заказов по статусу.
Такой подход позволяет избежать дублирования кода, так как общая логика находится в абстрактном репозитории, который наследуется другими репозиториями. Если логика изменится, нам будет достаточно внести изменения только в одном месте - в базовом репозитории.