CodeIgniter中控制器调用模型方法失败的常见原因是模型未正确加载,解决方法包括:一、在控制器方法内手动加载;二、在构造函数中加载;三、配置自动加载;四、CI4中使用命名空间加载;五、动态加载带参数的模型实例。

在CodeIgniter中,若控制器无法调用模型方法或出现“Call to undefined method”错误,通常是因为模型类未被正确加载。以下是多种可行的加载模型类的方法:
一、在控制器方法内手动加载
此方式适用于仅在特定操作中使用模型的场景,可避免全局加载带来的性能开销。模型仅在需要时实例化,内存占用可控。
1、在控制器的某个方法(如index())内部,调用$this->load->model()方法。
2、传入模型文件名(不含.php后缀),例如:$this->load->model('User_model')。
3、加载后即可通过$this->User_model->method_name()调用该模型中的公共方法。
4、若模型位于子目录下(如models/auth/Login_model.php),需使用斜杠分隔:$this->load->model('auth/Login_model')。
二、在控制器构造函数中加载
当模型需在控制器多个方法中被频繁调用时,可在构造函数中统一加载,确保所有方法均可直接访问,避免重复书写加载语句。
1、在控制器类定义中,声明__construct()方法并调用parent::__construct()。
2、在构造函数体中添加$this->load->model('Product_model')语句。
3、确保模型类文件名与类名严格匹配(如Product_model.php内定义class Product_model extends CI_Model)。
4、此后控制器内任意方法均可直接使用$this->Product_model对象,无需再次加载。
三、配置自动加载模型
适用于全站通用、高频使用的模型(如Auth_model、Setting_model),系统初始化阶段即完成加载,省去手动调用步骤。
1、打开application/config/autoload.php文件。
2、定位到$autoload['model']数组项。
3、将模型名以字符串形式加入该数组,例如:$autoload['model'] = array('Auth_model', 'Setting_model')。
4、保存后,所有控制器在实例化时将自动加载所列模型,无需额外代码。
四、使用命名空间在CodeIgniter 4中加载
CodeIgniter 4采用PSR-4自动加载机制,模型需按命名空间路径存放并正确声明,加载方式与CI3有本质区别。
1、确认模型文件位于app/Models/目录下,例如app/Models/UserModel.php。
2、在文件顶部声明命名空间:namespace App\Models;,并继承CodeIgniter\Model。
3、在控制器中使用use语句引入:use App\Models\UserModel;
4、通过new UserModel()或服务定位器获取实例:model('UserModel')。
五、动态加载带参数的模型实例
当需为同一模型创建多个独立实例(如连接不同数据库前缀的表),可通过传递配置参数实现隔离式加载。
1、准备模型类支持构造参数,例如在__construct()中接收$db_group或$table_prefix。
2、调用$this->load->model()时传入第二个参数作为别名:$this->load->model('Log_model', 'admin_log')。
3、加载后使用$this->admin_log->write()而非$this->Log_model->write(),避免与默认实例冲突。
4、确保模型内部逻辑能识别并响应传入的别名或配置上下文。

















