Symfony 4 Как использовать одну Entity с несколькими Репозиториями?

В Symfony 4 вы можете использовать одну Entity с несколькими Репозиториями, чтобы разделить ответственность за доступ к данным между различными компонентами вашего приложения.

Во-первых, вам понадобится создать вашу сущность (Entity) с помощью Doctrine аннотаций или XML/YAML маппинга, как обычно. Допустим, у вас есть сущность User:

namespace AppEntity;

use DoctrineORMMapping as ORM;

/**
 * @ORMEntity(repositoryClass="AppRepositoryUserRepository")
 */
class User
{
    // ...
}

Далее вам нужно создать репозитории (Repositories) для различных компонентов вашего приложения. Например, у вас может быть UserRepository для работы с пользователями и AdminRepository для работы с администраторами:

namespace AppRepository;

use DoctrineBundleDoctrineBundleRepositoryServiceEntityRepository;
use DoctrinePersistenceManagerRegistry;

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

    // Здесь вы можете определить дополнительные методы для работы с пользователями
    // ...
}
namespace AppRepository;

use DoctrineBundleDoctrineBundleRepositoryServiceEntityRepository;
use DoctrinePersistenceManagerRegistry;

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

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

Обратите внимание, что в обоих репозиториях мы передаем класс User в качестве аргумента конструктора для ServiceEntityRepository. Это говорит Doctrine о том, что мы хотим использовать одну и ту же сущность для обоих репозиториев.

Затем вам нужно зарегистрировать репозитории в вашем файле конфигурации(например, services.yaml):

services:
    AppRepositoryUserRepository:
        tags: [doctrine.repository_service]
    AppRepositoryAdminRepository:
        tags: [doctrine.repository_service]

Теперь вы можете использовать UserRepository для работы с пользователями, а AdminRepository для работы с администраторами:

use AppRepositoryUserRepository;
use AppRepositoryAdminRepository;

class UserController extends AbstractController
{
    public function index(UserRepository $userRepository, AdminRepository $adminRepository)
    {
        // Получение всех пользователей
        $users = $userRepository->findAll();

        // Получение всех администраторов
        $admins = $adminRepository->findAll();

        // ...
    }
}

Таким образом, вы можете использовать одну Entity с несколькими Репозиториями, чтобы разделить доступ к данным между различными компонентами вашего приложения в Symfony 4.