在 symfony 中查找当前 Doctrine 数据库连接设置

Posted

技术标签:

【中文标题】在 symfony 中查找当前 Doctrine 数据库连接设置【英文标题】:Find current Doctrine database connection settings in symfony 【发布时间】:2011-08-26 02:37:51 【问题描述】:

我需要知道 symfony 项目中的数据库名称和数据库服务器名称。如何在 symfony 中以编程方式访问当前的数据库连接设置(使用 Doctrine)?

【问题讨论】:

【参考方案1】:

假设您的 EntityManager 为 $this->em

从 Symfony2 获取 Doctrine 数据库名称:

$this->em->getConnection()->getDatabase();

从 Symfony2 获取 Doctrine 主机名(服务器名):

$this->em->getConnection()->getHost();

您可以从连接中访问许多其他参数,例如usernameportpassword。请参阅connection class 了解更多信息

【讨论】:

请注意,自 2019 年 5 月以来,除 getDatabase() 之外的所有内容都已被弃用,显然没有替换:github.com/doctrine/dbal/issues/3580 所以关于此问题的其他方法现在可能同样有效。【参考方案2】:

例如:

foreach(Doctrine_Manager::getInstance()->getConnections() as $connection)
  $conn = $connection->getOptions();
  preg_match('/host=(.*);/', $conn['dsn'], $host);
  var_dump($host);

【讨论】:

我认为有更优雅的方式,见***.com/a/26505585/744975【参考方案3】:

特定连接的 dsn 中的 dbname:

databases.yml

all:
  conexion1:
    class: sfDoctrineDatabase
    param:
      dsn: 'mysql:host=localhost;dbname=basegestion1'
      username: miusuario
      password: ********
  conexion2:
    class: sfDoctrineDatabase
    param:
      dsn: 'mysql:host=localhost;dbname=baseestadisticas1'
      username: miusuario
      password: ********

在行动中:

$mConexion1Options = Doctrine_Manager::getInstance()->getConnection('conexion1')->getOptions();
preg_match('/dbname=(.*)/', $mConexion1Options['dsn'], $mDbConexion1);

那么,dbname 是:

echo $mDbConexion1[1]; //basegestion1

【讨论】:

【参考方案4】:

使用此代码:

$myConnection           = Doctrine_Manager::getInstance()->getConnection('doctrine')->getOptions();
$dsnInfo                = $this->parseDsn($myConnection['dsn']);
$settings               = array();
$settings['dbUser']     = (string) $myConnection["username"];
$settings['dbPassword'] = (string) $myConnection["password"];
$settings['dbHost']     = (string) $dsnInfo["host"];
$settings['dbName']     = (string) $dsnInfo['dbname'];


private function parseDsn ($dsn)

  $dsnArray            = array();
  $dsnArray['phptype'] = substr($dsn, 0, strpos($dsn, ':'));
  preg_match('/dbname  = (\w+)/', $dsn, $dbname);
  $dsnArray['dbname']  = $dbname[1];
  preg_match('/host    = (\w+)/', $dsn, $host);
  $dsnArray['host']    = $host[1];

  return $dsnArray;

【讨论】:

【参考方案5】:

试试这个

$conn = Doctrine_Manager::getInstance()->getConnection('doctrine')->getOptions();

$dns_array = split(';', $conn['dsn']);
preg_match('/host=(.*);/', $dns_array, $dbhost);
preg_match('/dbname=(.*)/', $dns_array, $dbname);

$dbname = $dbname;
$dbhost = $dbhost;
$dbuser = $conn['username'];
$dbpass = $conn['password']; 

更新

因为Function split() is deprecated所以这里是推荐的方式。

$dns_array = explode(';', $conn['dsn']);
preg_match('/host=(.*)/', $dns_array[0], $dbhost);
preg_match('/dbname=(.*)/', $dns_array[2], $dbname);

$dbhost = $dbhost[1];
$dbname = $dbname[1];
$dbuser = $conn['username'];
$dbpass = $conn['password'];

【讨论】:

以上是关于在 symfony 中查找当前 Doctrine 数据库连接设置的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Symfony3在Doctrine2 Entity中运行查询查询

在 Symfony 中将 JSON 转换为 Doctrine 实体

如何在 Doctrine ORM 查询中查找与别名相关的表?

如何在 Symfony 2 / Doctrine 中启用 ENUM

如何在 Symfony 中添加 Doctrine 过滤器?

在 Symfony 中防止 Doctrine 的查询缓存