Symfony 3.4和Doctrine:如何使用连接名称从服务内部获取config.yml中定义的连接

时间:2018-05-22 08:15:27

标签: php symfony doctrine symfony-3.4

我有两个数据库用于生产,一个用于备份。我希望在Symfony中有一个服务,从命令调用,可以在这两个数据库之一中执行一些SQL查询,具体取决于命令传递的连接名称。问题是我不知道如何使用连接名称作为参数来获取DBAL连接。

我使用Symfony 3.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); 
    }

}

但我还没能从连接名称中获得连接,例如&#34; prod&#34;或&#34;备份&#34; (类似于:$ conn = $ this-&gt; getDoctrine() - &gt; 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 !!!


}

提前致谢。

3 个答案:

答案 0 :(得分:3)

您可以像这样使用依赖注入:

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'

答案 1 :(得分:1)

感谢你们两位。在你的答案中思考我已经尝试过:

我补充说:

use \Doctrine\ORM\EntityManager;

并直接在构造方法中调用Doctrine EntityManager。

public function __construct(EntityManager $entityManager)
{
    $this->entityManager = $entityManager;
}

public function exSQL($conn_name)
{

    $conn = $this->entityManager->getConnection($conn_name);

    $sql = "SELECT ...";
    $stmt = $conn->query($sql); 

    while ($row = $stmt->fetch()) {
        var_dump($row);
    }   

} 

它有效!!!!!

非常感谢!!!

答案 2 :(得分:0)

如果您可以访问学说,则可以执行类似

的操作
$this->getDoctrine()->getManager('backup');

但正如@AlessandroMinoccheri所说,最好直接注射它们。

如果您需要注入默认值,请使用doctrine.orm.entity_manager,如果您需要注入backup,请使用doctrine.orm.backup_entity_manager