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
相关产品推荐
相关产品推荐

