私は2つのデータベースを持っています。1つは本番用で、もう1つはバックアップ用です。コマンドから呼び出されるSymfonyに、コマンドによって渡される接続の名前に応じて、これら2つのデータベースのいずれかでいくつかのSQLクエリを実行できるサービスが必要です。問題は、接続の名前をパラメーターとして使用してDBAL接続を取得する方法がわからないことです。
私はSymfony3.4を使用しています。
config.ymlは次のとおりです。
#config.yml
doctrine:
dbal:
default_connection: prod
connections:
prod:
driver: '%database_driver1%'
host: '%database_host1%'
port: '%database_port1%'
dbname: '%database_name1%'
user: '%database_user1%'
password: '%database_password1%'
charset: UTF8
backup:
driver: '%database_driver2%'
host: '%database_host2%'
port: '%database_port2%'
dbname: '%database_name2%'
user: '%database_user2%'
password: '%database_password2%'
charset: UTF8
Miのアイデアは次のようなサービスを提供しています。
<?php
namespace ErqBundle\Services;
use Doctrine\DBAL\Driver\Connection;
class ProcSQL {
public function exSQL($conn_name)
{
// How to obtain the connection ????
$conn=$this->getDoctrine()->getConnection($conn_name);
// This doesn't work !!!
$sql = "SELECT ....";
$stmt = $conn->query($sql);
}
}
しかし、「prod」や「backup」などの接続名から接続を取得できませんでした($ conn = $ this-> getDoctrine()-> getConnection($ conn_name)など)
私がそれを機能させる唯一の方法は、接続パラメーターを再度定義し、次のように接続することです。
public function exSQL()
{
$config = new \Doctrine\DBAL\Configuration();
$connectionParams = array(
'dbname' => 'dbname',
'user' => 'user',
'password' => 'password',
'host' => 'prod_host',
'driver' => 'pdo_mysql',
);
$conn = \Doctrine\DBAL\DriverManager::getConnection($connectionParams, $config);
$sql = "SELECT ...";
$stmt = $conn->query($sql);
while ($row = $stmt->fetch()) {
var_dump($row);
}
// This works !!!
}
前もって感謝します。
次のように依存性注入を使用できます。
use \Doctrine\ORM\EntityManager;
class ProcSQL {
private $entityManager
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}
public function exSQL($conn_name)
{
$conn = $this->entityManager->getConnection($conn_name);
}
}
このようにサービスを宣言する必要があります(自動配線を使用しているかどうかはわかりません)。
ErqBundle\Services\ProcSql:
class: ErqBundle\Services\ProcSql
arguments:
- '@doctrine.orm.entity_manager'
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加