用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.. !
}