Symfony中的动态数据库连接



我有第二个实体管理器,我想从数据库中获取参数,并更改DATABASE_URL以连接到另一个数据库。

# config/packages/doctrine.yaml
my_entity:
url: '%DATABASE_URL%'
driver: 'pdo_mysql'
server_version: '5.7'
charset: utf8mb4

我试图从Kernel.php的process函数中添加一个参数,但它显然只运行了一次。

这可以通过更改Connection类的数据来完成。您需要创建自己的Connection类,并将其连接到项目中。

让我们创建所需的类Connection

// src/Doctrine/DatabaseConnection.php
use DoctrineDBALConnection;
use DoctrineDBALDriver;
class DatabaseConnection extends Connection
{
public function __construct(array $params, Driver $driver, $config, $eventManager )
{
// First, let symfony connect to the default database from env so that a Connection instance appears in order to execute a sql query to get the necessary data
parent::__construct($params, $driver, $config, $eventManager);
// Getting data and changing it
$user_database =  $this->executeQuery('SELECT * FROM database WHERE user_id = :user_id',['user_id'=>1])->fetch();
$params['dbname'] = $user_database['dbname'];
$params['user'] =  $user_database['user'];
$params['password'] = $user_database['password'];
parent::__construct($params, $driver, $config, $eventManager);
}
}

注意:正如您在示例中看到的,首先,我们从.env连接到主数据库,这样我们就可以通过执行sql查询来访问所需的数据库。收到数据后,我们对其进行修改,并再次调用父级的构造函数方法,以将Connection实例替换为我们想要的数据库。

初始化数据库连接

# config/packages/doctrine.yaml
doctrine:
dbal:
url: '%env(resolve:DATABASE_URL)%'
wrapper_class: AppDoctrineDatabaseConnection

注意:在这里,我们使用DBAL wrapperClass选项连接了我们的处理程序

最新更新