PHP - 多个不同的数据库依赖注入类 [英] PHP - multiple different databases dependency injected class

查看:276
本文介绍了PHP - 多个不同的数据库依赖注入类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我花了最后几个小时试图找到一个最好的,最逻辑的方式写一个php数据库类同时连接到一个postgresql db和一个mysql db的答案。此外,我想采用一个依赖注入的设计,但是新的整个概念。

I've spent the last several hours trying to find an answer to the "best", most logical, etc way to write a php database class to simultaneously connect to one postgresql db and one mysql db. Also, I'd like to adopt a Dependency Injection design but am new to that whole concept.

到目前为止我想出了...

So far I've come up with...

class Database {

    public function PgSqlConnect() {
            /* Connect to database */
        $host = 'localhost';
        $dbname = '---';
        $user = '---';
        $pass = '---';
        $timeout = 5;   /* seconds */

        try {
            $pgsql_dbh = new PDO("pgsql:host=$host; dbname=$dbname", $user, $pass); 
            $pgsql_dbh->setAttribute( PDO::ATTR_TIMEOUT, $timeout ); 
            $pgsql_dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

            return $pgsql_dbh;
        } catch( PDOException $e ) {
            echo 'Unable to connect to database: ' . $e->getMessage();
        }
    }


    public function MySqlConnect() {
            /* Connect to database */
        $host = 'localhost';
        $dbname = '---';
        $user = '---';
        $pass = '---';
        $timeout = 5;   /* seconds */

        try {
            $mysql_dbh = new PDO("mysql:host=$host; dbname=$dbname", $user, $pass); 
            $mysql_dbh->setAttribute( PDO::ATTR_TIMEOUT, $timeout ); 
            $mysql_dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

            return $mysql_dbh;
        } catch( PDOException $e ) {
            echo 'Unable to connect to database: ' . $e->getMessage();
        }
    }

}

重复的代码违反DRY方法。我知道并且已经看到了多个db连接的例子,但大多数处理相同的驱动程序,并且不提供DI能力。

Obviously the duplicated code violates the DRY approach. I know and have seen many examples of multiple db connections, but most deal with same driver and don't provide DI capability.

我还应该补充说,将连接细节放入Database类构造函数中作为...

I should also add that I've considered placing the connection details into the Database class constructor as...

$driver = 'mysql';
...
$mysqldb = new Database($driver,$un,$pw,...);

$driver = 'pgsql';
...
$pgsqldb = new Database($driver,$un,$pw,...);

但我不知道这是真的好主意, 。

but I don't know if that is really a good idea nor how well it would work with DI.

非常感谢!

推荐答案

所有数据库操作。

interface IDatabase
{
    function connect();
    function query();
    ...
}

然后有不同的驱动程序类实现这个接口

Then have different driver classes implementing this interface

class MySQLDB implements IDatabase
{
}
class PGSQLDB implements IDatabase
{
}

这样就可以轻松地使用依赖注入。

This way you can easily use dependency injection.

class Test
{
   private $db;

   function __construct(IDatabase $db)
   {
        $this->db = $db;
   }
}

您可以将其称为:

$mysqldb = new MySQLDB();
$test = new Test($mysqldb);
or
$pgsqldb = new PGSQLDB();
$test = new Test($pgsqldb);

这篇关于PHP - 多个不同的数据库依赖注入类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆