在MVC类中使用$ config数组

时间:2015-04-16 21:31:50

标签: php model-view-controller configuration config

我已经对此做了很多阅读,很多人都说我应该使用单身课程。我正在考虑写一个" Config"包括" config.php"的类。文件在__construct上并循环遍历$ config数组值并将它们放入$ this->值...

但后来我越来越多地阅读了如何永远不要使用单身人士。所以我的问题是 - 对此最好的方法是什么?我希望有一个配置文件,出于组织目的,包含我所有的$ config变量。出于灵活性等原因,我不想将数据库用户名和密码等硬件直接硬编码到方法中。

例如,我在我正在处理的MVC项目中使用以下代码:

公开/ index.php的

<?php

include '../app/bootstrap.php';

?>

应用/ bootstrap.php中

<?php

session_start();

function __autoload ($class) {  
    $file = '../app/'.str_replace('_', '/', strtolower($class)).'.php';

    if (file_exists($file)) {
        include $file;
    }
    else {
        die($file.' not found');
    }
}

$router = new lib_router();

?>

应用/ LIB / router.php

<?php

class lib_router {

    private $controller = 'controller_home'; // default controller
    private $method = 'index'; // default method
    private $params = array();

    public function __construct () {
        $this->getUrl()->route();
    }

    private function getUrl () {
        if (isset($_GET['url'])) {
            $url = trim($_GET['url'], '/');
            $url = filter_var($url, FILTER_SANITIZE_URL);
            $url = explode('/', $url);      

            $this->controller = isset($url[0]) ? 'controller_'.ucwords($url[0]) : $this->controller;
            $this->method = isset($url[1]) ? $url[1] : $this->method;

            unset($url[0], $url[1]);

            $this->params = array_values($url);
        }

        return $this;
    }

    public function route () {
        if (class_exists($this->controller)) {
            if (method_exists($this->controller, $this->method)) {
                call_user_func(array(new $this->controller, $this->method), $this->params);
            }
            else {
                die('Method '.$this->method.' does not exist');             
            }
        }
        else {          
            die('Class '.$this->controller.' does not exist');
        }
    }

}

?>

现在让我们说访问 http://localhost/myproject/lead/test

它将调用 controller_lead 类和测试方法。

以下是 app / controller / lead

的代码
<?php

class controller_lead extends controller_base {

    public function test ($params) {        
        echo "lead test works!";
    }

}

?>

应用/控制器/碱

<?php

class controller_base {

    private $db;
    private $model;

    public function __construct () {
        $this->connect()->getModel();
    }

    private function connect () {
        //$this->db = new PDO($config['db_type'] . ':host=' . $config['db_host'] . ';dbname=' . $config['db_name']. ', $config['db_user'], $config['db_pass'], $options);
        return $this;
    }

    private function getModel () {
        $model = str_replace('controller', 'model', get_class($this));
        $this->model = new $model($this->db);
    }

}

?>

这是我遇到问题的地方。如您所见, connect 方法将尝试创建一个新的PDO对象。现在我将如何注入这个 $ config 变量,给出我刚刚提供的所有其他代码?

我的选项似乎是:

  • 使用单身(坏)
  • 使用全局(更差)
  • 在bootstrap.php中包含config.php,并在多个类中注入它(当lib_router与数据库完全无关时,为什么要将它注入我的lib_router类?这听起来很糟糕。)

我还有其他选择吗?我不想做这3件事中的任何一件......

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

我最终在我的引导程序中包含一个配置文件,其中只包含常量,并使用了常量。

答案 1 :(得分:0)

  

我最终在我的引导程序中包含一个配置文件,其中只包含常量,并使用了常量。

对我来说情况也是如此 - 需要Model中的文件。基于文件的方法是最合适的,因为它有一些好处:您可以.gitignore,设置自定义权限集,所有参数集中存储等。

但是,如果配置文件仅包含数据库连接参数,我建议仅在Model中要求配置文件。也许,你也可以分解成多个更具体的配置文件,并在必要时需要它们。

public function __construct()
{
    if (self::$handle === FALSE)
    {
        $db = array();

        require APP_DIR.DIR_SEP.'system'.DIR_SEP.'config'.DIR_SEP.'Database.php';

        if (!empty($db))
        {
            $this->connect($db['db_host'], $db['db_user'], $db['db_password'], $db['db_name']);
        }
        else
        {
            Error::throw_error('Abimo Model : No database config found');
        }
    }
}