Symfony — Repository Как избежать двойного кода в этом случае?

В 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 может иметь метод для поиска заказов по статусу.

Такой подход позволяет избежать дублирования кода, так как общая логика находится в абстрактном репозитории, который наследуется другими репозиториями. Если логика изменится, нам будет достаточно внести изменения только в одном месте - в базовом репозитории.