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

标签 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() 函数放在一个包含文件中,并将其包含在类定义之外吗?还有其他选择吗?我只是想要它,以便没有任何东西将此脚本绑定(bind)到特定服务器。我更愿意将数据库服务器定义在一个单独的文件中,该文件在每个服务器上可能不同。我是 PHP 的新手,只是想知道专家们是如何处理这个问题的。

**编辑:开始工作了!这是所提供答案的混合体。

数据库连接.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();

?>

最佳答案

您需要使用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 创建父类或抽象类...

关于php - 对于 PHP REST API,如何在类定义之外定义/设置数据库连接参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44403898/

相关文章:

php - 从 doctrine 中的表中检索所有行

javascript - 应禁用表单字段,但单击按钮时应启用表单字段和列,

javascript - Bootstrap 模态弹出窗口在 PHP 页面上不起作用 |控制台没有显示错误

java - 如何使用 Spring Boot REST 生成自定义 JSON 响应?

javascript - JQuery Ajax动态表单,如何在表单上方的div中显示成功消息

spring - 如何在 Spring RESTful 中创建过滤器以防止 XSS?

java - HttpURLConnection - 返回格式

Ruby TestUnit、VCR 和 HTTP API 请求

javascript - 在 webOS 中隐藏唯一的 API key (Enyo/JavaScript)

api - 移动 HTML5 应用程序如何使用 OAuth 2 协议(protocol)?