对于PHP REST API,如何在类定义之外定义/设置数据库连接参数?

时间:2017-06-07 05:03:22

标签: php rest api variables parameters

我正在使用遍布网络的PHP REST API示例。这基本上就是这样:

<?php

    require_once("Rest.inc.php");

    class API extends REST {

        const DB_SERVER     = "myhost";
        const DB_USER       = "myuser";
        const DB_PASSWORD   = "mypassword";
        const DB_NAME       = "mydb";

        public $data = "";
        private $db = NULL;

        public function __construct(){
            parent::__construct();
            $this->dbConnect();
        }

        private function dbConnect(){

            try {
                $this->db = new PDO("mysql:host=" . self::DB_SERVER . ";dbname=" . self::DB_NAME, self::DB_USER, self::DB_PASSWORD);
                $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            }
            catch(PDOException $e) {
                echo "Connection failed: " . $e->getMessage();
            }
        }


        public function processApi(){

            $func = strtolower(trim(str_replace("/","",$_REQUEST['rquest'])));

            if((int)method_exists($this,$func) > 0) {
                $this->$func();
            } else {
                $this->response('',404);
            }

        }

        private function activity(){
            ...
        }

        private function client(){
            ...
        }

        private function facility(){
            ...
        }

        etc...

        private function json($data){
            if(is_array($data)){
                return json_encode($data);
            }
        }
    }

    // Initiiate Library

    $api = new API;
    $api->processApi();

?>

它工作正常,但我不想在该脚本中硬编码数据库连接参数。将它们与此脚本分开的最佳方法是什么(或者有办法)是什么?我不能在类声明中使用包含文件。我可以将整个dbConnect()函数放在包含文件中,并将其包含在类定义之外吗?还有其他选择吗?我只是想要它,以便没有任何东西将这个脚本绑定到特定的服务器。我希望将db服务器定义在一个单独的文件中,每个服务器上的文件可能不同。我是PHP的新手,只是想知道专家如何处理这个问题。

**编辑:搞定了!这是所提供答案的混合体。

dbConnect.php

<?php
    class DB {

        const DB_SERVER     = "myserver";
        const DB_USER       = "myuser";
        const DB_PASSWORD   = "mypassword";
        const DB_NAME       = "mydb";

        private $db = null;

        public function __construct() {
            try {
                $this->db = new PDO("mysql:host=" . self::DB_SERVER . ";dbname=" . self::DB_NAME, self::DB_USER, self::DB_PASSWORD);
                $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            }
            catch(PDOException $e) {
                echo "Connection failed: " . $e->getMessage();
            }
        }
    }
?>

api.php

<?php

    require_once("Rest.inc.php");
    require_once("dbConnect.php");

    class API extends REST {            
        public $data = "";
        private $db = null;

        public function __construct(DB $mydb){
            parent::__construct();
            $this->db = mydb->db;
        }
    }

    // Initiiate Library

    $api = new API(new DB());
    $api->processApi();

?>

3 个答案:

答案 0 :(得分:2)

您可以使用以下内容:

<强> db.php中:

在单独的类中创建连接函数。

the_pandas_serie_object.values()

<强> current_file.php

class DB {
    const DB_SERVER     = "myhost";
    const DB_USER       = "myuser";
    const DB_PASSWORD   = "mypassword";
    const DB_NAME       = "mydb";

    public $data = "";
    private $db = NULL;

    private function dbConnect(){

        try {
            $this->db = new PDO("mysql:host=" . self::DB_SERVER . ";dbname=" . self::DB_NAME, self::DB_USER, self::DB_PASSWORD);
            $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        catch(PDOException $e) {
            echo "Connection failed: " . $e->getMessage();
        }
    }
}

答案 1 :(得分:2)

您需要使用Dependency Injection模式,它会对您有所帮助。你会得到类似的东西:

interface DB
{
    // Here you need to declare your common methods for all DB classes.
}

class MasterDB implements DB
{
    const DB_SERVER     = "myhost";
    const DB_USER       = "myuser";
    const DB_PASSWORD   = "mypassword";
    const DB_NAME       = "mydb";

    private $db = null;

    private function __construct()
    {
        try {
            $this->db = new PDO("mysql:host=" . self::DB_SERVER . ";dbname=" . self::DB_NAME, self::DB_USER, self::DB_PASSWORD);
            $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        catch(PDOException $e) {
            echo "Connection failed: " . $e->getMessage();
        }
    }
}

class SlaveDB implements DB
{
    // Here you need to provide another connection
}

class API extends REST
{
    private $db = null;

    public function __construct(DB $db)
    {
        parent::__construct();
        $this->db = $db;
    }
}

$api = new API(new MasterDB());
// or
$api = new API(new SlaveDB());
$api->processApi();

这不是一个完美的例子,但这个会帮助你解决问题!下一步可能是 - 为MasterDBSlaveDB创建父类或抽象类......

答案 2 :(得分:0)

我建议您定义一个ini配置文件,并在ini文件中配置数据库配置。

使用方法parse_ini_file从ini文件中获取配置。通过这种方式,您将为每个服务器配置不同的配置。

可以找到有关创建和解析ini文件的文档here