CodeIgniter 3.1跨控制器类调用函数失败求助
解决CodeIgniter跨控制器调用方法的报错问题
嘿,你在CodeIgniter里跨控制器调用方法时踩坑啦!直接用new关键字实例化另一个控制器是行不通的——CI的控制器依赖框架的核心服务(比如加载器、数据库连接等),直接实例化会导致控制器没有被正确初始化,进而出现方法调用失败的错误。
下面给你两种靠谱的解决方案:
方案1:用CI自带的控制器加载方式(快速解决)
CodeIgniter提供了专门的方法来加载其他控制器,你只需要把datatraining.php里的代码改成这样:
class datatraining extends CI_Controller { public function progress(){ // 加载chisquare控制器 $this->load->library('../controllers/chisquare'); // 调用目标方法 $this->chisquare->processnaivebayes(); } }
方案2:把公共逻辑抽离到库/模型(更符合MVC架构)
其实控制器的职责是处理请求和返回响应,互相调用并不是最佳实践。更合理的做法是把processnaivebayes()里的业务逻辑抽离到自定义库或者模型中:
- 先创建一个自定义库,比如
application/libraries/NaiveBayesProcessor.php:
class NaiveBayesProcessor { protected $CI; // 构造函数中获取CI实例,方便调用框架组件 public function __construct() { $this->CI =& get_instance(); // 如果需要用到数据库等服务,在这里加载即可 // $this->CI->load->database(); } public function processnaivebayes(){ // 这里放原来chisquare控制器里的逻辑代码 ........ } }
- 之后不管是
datatraining还是chisquare控制器,都可以轻松调用这个库:
// datatraining控制器的调用方式 class datatraining extends CI_Controller { public function progress(){ $this->load->library('NaiveBayesProcessor'); $this->naivebayesprocessor->processnaivebayes(); } } // chisquare控制器的调用方式 class chisquare extends CI_Controller { public function processnaivebayes(){ $this->load->library('NaiveBayesProcessor'); $this->naivebayesprocessor->processnaivebayes(); } }
这样既解决了报错问题,还让代码更符合MVC的设计原则,后续维护和复用也更方便~
内容的提问来源于stack exchange,提问作者Dhitta Hananda
相关产品推荐
相关产品推荐

