【发布时间】:2020-08-31 16:02:24
【问题描述】:
我有一个默认的实体管理器,它运行良好,可以管理我们拥有的所有实体。
但是现在,我想添加另一个基于相同连接设置的实体管理器,但数据库名称已更改(凭据、表等相同,但在另一个数据库中)。
默认连接的配置:
doctrine:
dbal:
default_connection: default_conn
connections:
default_conn:
wrapper_class: Project\Dbal\Connection\ConnectionWrapper
url: '%env(DEFAULT_DB_URL)%'
ConnectionWrapper:
class ConnectionWrapper extends Connection
{
public function __construct(array $params, Driver $driver, ?Configuration $config = null,
?EventManager $eventManager = null)
{
$params['dbname'] = DatabaseSingleton::getInstance();
parent::__construct($params, $driver, $config, $eventManager);
}
public function switch(string $dbName): void
{
// close current connection if required
if ($this->isConnected()) {
$this->close();
}
// replace database url with new database name
$params = $this->getParams();
$url = substr($params['url'], 0, strlen($params['url']) - strlen($params['dbname'])) . $dbName;
// replace connection's params
$params['url'] = $url;
$params['dbname'] = $dbName; // new_database_name
DatabaseSingleton::setValue($dbName);
// initialize again the connection with updated connection's parameters
$this->__construct($params, $this->_driver, $this->_config, $this->_eventManager);
}
}
控制器中携带改变数据库名称的代码(也就是说,调用这个控制器动作后连接(和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:我的单身班似乎不是工人......
【问题讨论】:
标签: symfony doctrine-orm doctrine entitymanager