You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CodeIgniter的config.php中获取当前控制器名称?

解决CodeIgniter中根据控制器动态修改配置的问题

嘿,我来帮你搞定这个问题!你之前在config.php里直接用$this->router->fetch_class()没生效,是因为config.php是CodeIgniter初始化流程中非常早被加载的文件,这时候Router类还没被实例化,自然调用不了它的方法。下面给你几个靠谱的解决方案,按需选择:

方案1:通过原生URI解析判断控制器(适合简单场景)

如果你的项目没有复杂的路由重写,第一个URI片段就是控制器名称,我们可以用原生PHP代码解析请求URI来获取控制器名:

// 在config.php中添加以下代码
$request_uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';
// 去掉URI中的查询字符串(比如?xxx=yyy部分)
$uri_path = parse_url($request_uri, PHP_URL_PATH);
// 分割URI为片段,去掉首尾的斜杠
$segments = explode('/', trim($uri_path, '/'));
// 默认控制器是Welcome(CI的默认路由规则)
$controller = !empty($segments[0]) ? $segments[0] : 'Welcome';

// 仅当控制器不是Welcome时,修改配置
if ($controller !== 'Welcome') {
    $config['sess_cookie_name'] = 'your_custom_session_cookie';
    // 这里可以添加其他需要修改的配置项
    // $config['another_config'] = 'value';
}

这个方法不依赖CI的任何类,在config.php加载阶段就能正常运行,适合没有自定义路由的简单项目。

方案2:使用CodeIgniter钩子(推荐,支持路由重写)

如果你的项目有自定义路由,用URI片段判断可能不准确,这时候用CI的钩子(Hooks)是最佳选择——钩子可以在控制器初始化完成后触发,这时候Router类已经可用,能准确获取实际的控制器名称:

步骤1:启用钩子

打开config/config.php,找到enable_hooks配置并设置为TRUE:

$config['enable_hooks'] = TRUE;

步骤2:定义钩子

打开config/hooks.php,添加以下钩子配置:

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

步骤3:创建钩子类

在application/hooks/目录下新建ConfigAdjuster.php文件,内容如下:

class ConfigAdjuster {
    public function adjustSessionConfig() {
        // 获取CI实例
        $CI =& get_instance();
        // 准确获取当前控制器名称
        $current_controller = $CI->router->fetch_class();
        
        if ($current_controller !== 'Welcome') {
            // 使用set_item方法修改配置(直接改$config数组无效,因为配置已经加载)
            $CI->config->set_item('sess_cookie_name', 'your_custom_session_cookie');
            // 其他需要修改的配置项同理
            // $CI->config->set_item('sess_expiration', 3600);
        }
    }
}

这个方案能完美适配自定义路由场景,而且不需要修改任何控制器代码,非常优雅。

方案3:通过基础控制器统一处理(适合控制器较少的项目)

如果你的非Welcome控制器不多,可以创建一个基础控制器,让所有非Welcome的控制器继承它,在基础控制器的构造函数中修改配置:

步骤1:创建基础控制器

在application/core/目录下新建MY_Controller.php文件:

class MY_Controller extends CI_Controller {
    public function __construct() {
        parent::__construct();
        
        // 因为继承这个类的都不是Welcome控制器,直接修改配置
        $this->config->set_item('sess_cookie_name', 'your_custom_session_cookie');
        // 其他配置项...
    }
}

步骤2:让非Welcome控制器继承基础控制器

比如你的Home控制器:

class Home extends MY_Controller {
    public function __construct() {
        parent::__construct();
        // 其他逻辑...
    }
}

而Welcome控制器保持默认继承CI_Controller即可,这样就只有非Welcome控制器会应用这些配置。


内容的提问来源于stack exchange,提问作者Tirkesh Turkesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:10:35