用Symfony中的新实体管理器替换默认实体管理器

用Symfony中的新实体管理器替换默认实体管理器,symfony,doctrine-orm,doctrine,entitymanager,Symfony,Doctrine Orm,Doctrine,Entitymanager,我有一个默认的实体管理器,它可以很好地管理我们所有的实体 但是现在,我想基于相同的连接设置添加另一个实体管理器,除了更改凭据、表等的数据库名称。它们是相同的,但在另一个数据库中 默认连接的配置: doctrine: dbal: default_connection: default_conn connections: default_conn: wrapper_class: Project\Dbal\

我有一个默认的实体管理器,它可以很好地管理我们所有的实体

但是现在,我想基于相同的连接设置添加另一个实体管理器,除了更改凭据、表等的数据库名称。它们是相同的,但在另一个数据库中

默认连接的配置:

doctrine:
    dbal:
        default_connection: default_conn
        connections:
            default_conn:
                wrapper_class: Project\Dbal\Connection\ConnectionWrapper
                url: '%env(DEFAULT_DB_URL)%'
ConnectionWrapper:

控制器中携带数据库名称更改的代码,也就是说,调用此控制器操作后应更改连接和em:

/**
 * @Route("/e2e", methods={"PATCH"})
 */
public function switchDatabase(Request $request): void
{
   // switch connection's database name
   /** @var ConnectionWrapper $conn */
   $conn = $this->getDoctrine()->getConnection();
   $conn->switch('new_database_name', $logger);

   // creating new entity manager
   /** @var EntityManagerInterface $em */
   $em = $this->getDoctrine()->getManager();
   $this->getDoctrine()->resetManager();
   $newEm = EntityManager::create($conn, $em->getConfiguration(), $em->getEventManager());

   $user = new User('chris');
   $newEm->persist($user);
   $newEm->flush();

   // how to replace the current (old) entity manager with the new one?
   // how to retain this new for all other futures requests?
}
当我想要检索我的用户时,问题出现在另一个控制器中。使用的是具有旧数据库名称的旧实体管理器,而不是我的新管理器

public function test(EntityManagerInterface $em): JsonResponse
    {
        
        $entities = $em->getRepository(User::class)
                       ->findBy(['username' => 'chris']);

        return new JsonResponse($user); // no result.. !
    }
如何在所有Symfony应用程序上使用新创建的实体管理器替换默认实体管理器,而不仅仅是在控制器内使用$newEm变量

问题是我无法在控制器中使用$newEm进行查询。但是我没有成功地用这个新的管理器替换Symfony应用程序的默认实体管理器


PS:我的singleton类似乎不是worker…

您应该采取不同的方法,而不是尝试替换由symfonys依赖项注入容器管理的实体管理器:

Symfony/Doctrine允许您配置第二个Doctrine dbal连接和第二个实体管理器。然后,Symfony将管理这两个实体管理器,您可以决定在哪个服务中需要哪个实体管理器

请参阅本文档:

public function test(EntityManagerInterface $em): JsonResponse
    {
        
        $entities = $em->getRepository(User::class)
                       ->findBy(['username' => 'chris']);

        return new JsonResponse($user); // no result.. !
    }