Symfony 中的动态数据库连接

Dynamic database connection in Symfony

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

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

我尝试从 Kernel.php 的过程函数中添加一个参数,但显然 运行 只有一次。

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

让我们创建所需的class连接

// src/Doctrine/DatabaseConnection.php

use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Driver;

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: App\Doctrine\DatabaseConnection

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