Symfony 3.4とDoctrine:接続の名前を使用してサービス内からconfig.ymlで定義された接続を取得するにはどうすればよいですか?

ジョンA。

私は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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ