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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值