通常 一个项目会存在生产环境(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 中代码:
<?php namespace 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 ,就可以做到开发、生产环境使用不同的配置参数。