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

CodeIgniter 3.1.7 URL重写场景下获取真实控制器与方法名

解决CodeIgniter 3.1.7 URL重写后获取真实控制器/方法名的问题

嘿,我刚好在CodeIgniter 3.x项目里踩过完全一样的坑——启用URL重写+自定义路由后,要在调试菜单里显示真实的控制器和方法名,而不是URL里的别名。给你两个最靠谱的方案,都是利用CI内置的路由对象,完全不需要自己解析URL:

方案1:全局场景(比如调试菜单的公共代码里)

如果你的调试菜单是放在公共模板、钩子或者单独的辅助函数里,需要跨控制器调用的话,直接通过CI的超级对象获取路由信息:

// 获取CI实例
$CI =& get_instance();
// 真实控制器名(CI默认返回小写,这里转成首字母大写匹配你要的格式)
$real_controller = ucfirst($CI->router->class);
// 真实方法名
$real_method = ucfirst($CI->router->method);

// 输出你要的格式
echo "Controller: {$real_controller} Function: {$real_method}";

方案2:控制器内部场景

如果是在某个控制器的方法里直接获取,更简单,直接用当前控制器的router属性:

// 在Account控制器的Login方法里
echo "Controller: " . ucfirst($this->router->class) . " Function: " . ucfirst($this->router->method);

为什么这个方法有效?

不管你用了.htaccess做URL重写,还是在application/config/routes.php里定义了自定义路由规则,CodeIgniter的路由系统都会自动把请求解析为真实的控制器和方法,并把这两个值存在router对象的class和method属性里。这两个属性完全不受URL显示的别名影响,就是实际处理请求的控制器类名和方法名。

特殊情况处理:如果用了_remap方法

如果你的控制器里用了CI的_remap方法来重写方法调用逻辑,$CI->router->method会返回URL里的方法名,而不是实际执行的方法。这种情况下,你可以在控制器里自定义一个属性,在_remap里把实际执行的方法名存进去,比如:

class Account extends CI_Controller {
    public $actual_method;

    public function _remap($method) {
        // 假设实际执行的是login方法
        $this->actual_method = 'login';
        $this->login();
    }
}

然后在调试菜单里通过$CI->actual_method获取真实执行的方法名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:57:39