CI多环境配置与hooks做权限出现的问题

来源:互联网 发布:淘宝客服 编辑:程序博客网 时间:2024/06/05 23:53

通常 一个项目会存在生产环境(production)和开发环境(development),两者的配置往往不一样。如:production连接正式数据库,而development连接测试数据。CI框架提供了多环境配置的办法。继上次在hooks中对CI做了简单权限验证后,需要配置CI多环境。hooks做权限验证链接:>http://blog.csdn.net/xiojing825/article/details/72486068

一.CI 多环境配置文档地址
http://codeigniter.org.cn/user_guide/libraries/config.html
引用原文:

多环境
你可以根据当前的环境来加载不同的配置文件,index.php 文件中定义了 ENVIRONMENT 常量,在 处理多环境 中有更详细的介绍。

要创建特定环境的配置文件,新建或复制一个配置文件到application/config/{ENVIRONMENT}/{FILENAME}.php 。

例如,要新建一个生产环境的配置文件,你可以:
新建目录 application/config/production/
将已有的 config.php 文件拷贝到该目录
编辑 application/config/production/config.php 文件,使用生产环境下配置

二.程序:
1.在index.php定义环境变量ENVIRONMENT 的值为“development” 。

//注释默认的ENVIRONMENT定义,实际不注释也可以,因为默认ENVIRONMENT 的值就是“development” //define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');define('ENVIRONMENT', 'development');

2.在application/config下新建文件夹development,复制config/config.php 到development下。

3.在application/config/development/config.php 添加配置

////测试环境的mysql$config['dev_mysql_host'] = 'mysql:host=121.*.***.64;dbname=sdk;port=20000;charset=utf8';$config['dev_mysql_username'] = 'username';$config['dev_mysql_password'] = 'password';

经过以上步骤后所有继承自CI_Controller 的类就可使用$this->config->item(‘dev_mysql_username’);读取application/config/development/config.php 中的配置参数。

4.定义AdminDB的类,application/libraries /AdminDB.php 中代码:

<?phpnamespace libraries;define('__ROOT__', dirname(dirname(dirname(__FILE__))));include_once __ROOT__ . "/vendor/autoload.php";class AdminDB{    static $db = NULL;    public static function __callStatic($name, $arguments)    {        $ci    = &get_instance();        $host = $ci->config->item('dev_mongo');        if (self::$db == NULL) {            self::$db = (new \MongoDB\Client($host))->selectDatabase('my_db');        }        return \call_user_func_array([self::$db, $name], $arguments);    }}

在hooks 类application/hooks/checkLogin.php 中做登录验证用到了AdminDB 类。而AdminDB并不是继承自CI_Controller。为了能够读取配置参数,使用$ci = &get_instance();获得一个CodeIgniter的超级对象。然而程序运行时这一行报错

$host = $ci->config->item('dev_mongo');//var_dump($ci);//打印$ci为NULL

找了半天发现application/config/hooks.php 文件中 ,设置的checkLogin 为“pre_controller”,即调用控制器前执行,而在“pre_controller”这个阶段使用get_instance()无法获取到超级对象。

$hook['pre_controller'] = array(    'class'    => 'checkLogin',    'function' => 'index',    'filename' => 'checkLogin.php',    'filepath' => 'hooks',    //可不传参数    //'params'   => array('beer', 'wine', 'snacks'));

将“pre_controller”改成“post_controller_constructor”。让hooks类checkLogin在控制器实例化之后立即执行。程序不再报错,即AdminDB中的$ci = &get_instance();获取到了超级对象。

$hook['post_controller_constructor'] = array(    'class'    => 'checkLogin',    'function' => 'index',    'filename' => 'checkLogin.php',    'filepath' => 'hooks',);

三、总结:
同理,可参照二中的步骤,配置production 环境。在代码提交时,不让开发环境中的index.php覆盖生产环境中index.php ,就可以做到开发、生产环境使用不同的配置参数。

原创粉丝点击