gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:02:06 24 4
gpt4 key购买 nike

我有一个默认实体管理器,它运行良好并管理我们拥有的整个实体。

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

默认连接的配置:

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);
}
}

controller中携带数据库名称变化的代码(也就是说,connection(和em)在调用这个controller action后应该改变):

/**
* @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?
}

当我想检索我的用户时,问题出在其他 Controller 中。使用的是旧实体管理器(具有旧数据库名称),而不是我的新管理器..

public function test(EntityManagerInterface $em): JsonResponse
{

$entities = $em->getRepository(User::class)
->findBy(['username' => 'chris']);

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

如何在所有 Symfony 应用程序上用新创建的 entity_manager 替换默认的 entity_manager(而不仅仅是在我的带有 $newEm 变量的 Controller 中)。

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

PS:我的单例类好像不是worker...

最佳答案

与其尝试替换由 symfonys 依赖注入(inject)容器管理的实体管理器,不如采取不同的方法:

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

请参阅此文档:https://symfony.com/doc/current/doctrine/multiple_entity_managers.html

关于symfony - 用 Symfony 中的新实体管理器替换默认实体管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63674235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com