Репозиторий, как правильно организовать однотипные запросы?

Для организации однотипных запросов в Symfony рекомендуется использовать паттерн проектирования "Репозиторий" и Doctrine ORM. Репозиторий представляет собой класс, который инкапсулирует логику доступа к данным (запросы) и предоставляет удобные методы для работы с моделями данных.

В рамках Symfony проекта, репозитории могут быть созданы в соответствующей директории src/Repository. Прежде всего, необходимо создать класс репозитория для соответствующей сущности. Например, если у вас есть сущность User, то вы можете создать класс UserRepository.php в директории src/Repository.

// src/Repository/UserRepository.php
namespace AppRepository;

use DoctrineBundleDoctrineBundleRepositoryServiceEntityRepository;
use DoctrinePersistenceManagerRegistry;
use AppEntityUser;

class UserRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, User::class);
    }

    // Здесь можно описать дополнительные методы для работы с User

    public function findByFirstName($firstName)
    {
        return $this->createQueryBuilder('u')
            ->andWhere('u.firstName = :firstName')
            ->setParameter('firstName', $firstName)
            ->getQuery()
            ->getResult();
    }

    // ...
}

Затем, вы должны зарегистрировать репозиторий в файле конфигурации config/services.yaml в разделе repositories:

services:
    # ...
    AppRepositoryUserRepository:
        factory: ['@doctrine', getRepository]
        arguments:
            - 'AppEntityUser'

Теперь, вы можете использовать репозиторий в любом месте в вашем приложении, включая контроллеры, сервисы и т.д. Например, в контроллере вы можете получить доступ к репозиторию следующим образом:

// src/Controller/UserController.php
namespace AppController;

use AppRepositoryUserRepository;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;

class UserController extends AbstractController
{
    public function index(UserRepository $userRepository): Response
    {
        $users = $userRepository->findAll();

        // ...

        return $this->render('user/index.html.twig', [
            'users' => $users,
        ]);
    }

    // ...
}

Вы также можете создавать собственные методы в репозитории для выполнения конкретных запросов с использованием QueryBuilder или DQL (Doctrine Query Language). Например, в приведенном выше примере репозитория UserRepository, добавлен метод findByFirstName($firstName), который возвращает всех пользователей с заданным именем.

Это только один из способов организации однотипных запросов в Symfony с использованием репозиториев. Вы также можете использовать другие пакеты и библиотеки, такие как Doctrine Extensions или Symfony Flex, для расширения функциональности репозиториев и упрощения работы с данными.