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 选项连接了我们的处理程序
我有第二个实体管理器,我想从数据库中获取参数并更改 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 选项连接了我们的处理程序