CodeIgniter全局变量设置:基于基础控制器的模板传值问询
嘿,既然你已经搞定了继承CI_Controller的基础控制器,那设置全局变量并传递到模板这事儿就简单多了!我给你分享几个实用的方案,你按需选就行:
方案1:用
$this->load->vars()全局注入视图(官方推荐) 这是CodeIgniter原生支持的最便捷方式,能把变量一次性传递给所有视图,不用在每个控制器里重复写。
步骤很简单:
- 打开你的基础控制器文件(比如
application/core/MY_Controller.php) - 在构造函数里定义全局变量,然后通过
$this->load->vars()传递:
class MY_Controller extends CI_Controller { public function __construct() { parent::__construct(); // 定义全局变量数组,比如站点信息、当前用户数据 $global_data = array( 'site_title' => '我的CI站点', 'current_user' => $this->session->userdata('logged_in_user'), // 从session取登录用户 'copyright' => '©2024 保留所有权利' ); // 把变量注入到所有视图 $this->load->vars($global_data); } }
之后,所有继承这个基础控制器的子控制器对应的视图,都能直接用这些变量:
<header> <h1><?php echo $site_title; ?></h1> <p>当前用户:<?php echo $current_user['username']; ?></p> </header> <footer><?php echo $copyright; ?></footer>
方案2:把变量存在基础控制器属性,兼顾控制器和视图调用
如果有些变量你不仅要在视图里用,在子控制器的方法里也需要调用,那可以把它定义成基础控制器的公共属性:
class MY_Controller extends CI_Controller { // 声明公共全局属性 public $global_vars; public function __construct() { parent::__construct(); $this->global_vars = array( 'theme' => 'default', 'max_upload_size' => '2MB' ); // 把属性传递给视图,或者用load->vars全局注入 $this->load->vars('global', $this->global_vars); } }
在子控制器里你可以直接用$this->global_vars['theme'],视图里则这样调用:
<div class="theme-<?php echo $global['theme']; ?>"> 最大上传限制:<?php echo $global['max_upload_size']; ?> </div>
方案3:用自定义配置文件存固定全局配置
如果是一些很少变动的固定配置(比如站点域名、联系方式),放在配置文件里管理更方便:
- 在
application/config/下新建global_config.php:
<?php $config['site_domain'] = 'https://example.com'; $config['contact_phone'] = '123-456789';
- 在基础控制器构造函数里加载并传递:
class MY_Controller extends CI_Controller { public function __construct() { parent::__construct(); // 加载自定义配置文件 $this->config->load('global_config'); // 把配置项转成视图可用的变量 $config_vars = array( 'site_domain' => $this->config->item('site_domain'), 'contact_phone' => $this->config->item('contact_phone') ); $this->load->vars($config_vars); } }
视图里直接用$site_domain和$contact_phone就行。
小Tips
- 如果子控制器需要覆盖全局变量,直接在子控制器里重新调用
$this->load->vars()传递同名变量,子控制器的变量会优先生效。 - 动态数据(比如未读消息数、实时用户状态)一定要放在基础控制器的构造函数里处理,这样每个请求都会刷新数据,保证最新。
内容的提问来源于stack exchange,提问作者Viscocent
相关产品推荐
相关产品推荐

