CodeIgniter在header视图引入model后非dashboard页面报错如何解决
问题原因
该报错本质是dashboard_model没有被全局加载,只有访问dashboard页面对应的控制器时,你提前在该控制器中加载了该模型,因此视图可以通过$this访问到模型实例;其他页面的控制器未加载dashboard_model,视图尝试调用未初始化的模型属性就会抛出错误。
另外在视图中直接调用模型查询数据不符合CodeIgniter的MVC设计规范,视图层仅应负责数据渲染,业务逻辑和数据查询应当放在控制器/模型层处理。
解决办法
可以根据你的业务场景选择以下任意一种方案:
方案1:全局自动加载模型(适合全站所有页面都需要用到该统计的场景)
打开application/config/autoload.php,找到模型自动加载配置项,添加dashboard_model即可:$autoload['model'] = array('dashboard_model');配置后框架会在每次请求时自动初始化该模型,所有页面的视图都可以直接调用。
方案2:自定义核心控制器统一处理公共数据(最推荐,符合MVC规范)
- 在
application/core目录下新建MY_Controller.php,继承默认的CI_Controller,在构造函数中统一加载模型、获取公共数据并全局传递到视图:
<?php class MY_Controller extends CI_Controller { public function __construct() { parent::__construct(); // 加载公共模型 $this->load->model('dashboard_model'); // 获取统计数据 $data['lead_count'] = $this->dashboard_model->combined(); // 全局传递数据,所有加载的视图都可以直接拿到该变量 $this->load->vars($data); } }- 所有业务控制器(包括dashboard、其他页面的控制器)都改为继承
MY_Controller而非默认的CI_Controller,示例:
class Dashboard extends MY_Controller { // 原有业务逻辑不变 }- 删除header视图中调用模型的代码,直接输出控制器传递的变量即可:
<li><a href="leads/">Active Leads (<?php echo $lead_count[0]["active"] ?>)</a></li>- 在
方案3:公共模板加载方法统一传参
如果你是在统一的方法中加载全站公共模板(header+主体+footer),可以在该方法中提前加载模型、获取统计数据,加载header视图时直接传入参数即可,不需要改动其他业务逻辑。
内容的提问来源于stack exchange,提问作者H2O
相关产品推荐
相关产品推荐

