CodeIgniter自定义Settings库无法正常工作,寻求技术解决方案
自定义CodeIgniter Settings库实现全局站点数据管理
核心思路与代码完善
看起来你已经搭好了Settings库的基础框架,我来帮你把这个库补全并优化,让它能顺利从数据表读取全局配置~
首先,假设你的数据表结构大概是这样(可以根据实际情况调整):
CREATE TABLE `site_settings` ( `id` int(11) NOT NULL AUTO_INCREMENT, `key` varchar(50) NOT NULL UNIQUE, `value` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
比如里面存的记录可以是:key为site_name,value为"我的站点";key为site_logo,value为"/assets/logo.png"这类。
接下来完善你的Settings类:
<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); class Settings { // 保存CI实例 protected $ci; // 存储设置的数组 public $settings = array(); public function __construct() { // 加载CI实例 $this->ci =& get_instance(); // 初始化加载设置数据 $this->load_settings(); } /** * 从数据库加载所有设置到$this->settings数组 */ private function load_settings() { // 假设你的数据表名为site_settings,可根据实际修改 $query = $this->ci->db->get('site_settings'); if ($query->num_rows() > 0) { foreach ($query->result() as $row) { // 将key作为数组键,value作为对应值 $this->settings[$row->key] = $row->value; } } } /** * 根据键名获取单个设置值 * @param string $key 设置的键名 * @param mixed $default 不存在时返回的默认值 * @return mixed */ public function get($key, $default = null) { return isset($this->settings[$key]) ? $this->settings[$key] : $default; } /** * 更新单个设置值 * @param string $key 设置的键名 * @param mixed $value 要更新的值 * @return bool 是否更新成功 */ public function set($key, $value) { $data = array('value' => $value); $this->ci->db->where('key', $key); $result = $this->ci->db->update('site_settings', $data); // 如果更新成功,同步更新内存中的数组 if ($result) { $this->settings[$key] = $value; return true; } return false; } /** * 获取所有设置 * @return array */ public function all() { return $this->settings; } }
使用方法
加载库:
你可以在application/config/autoload.php里自动加载这个库,这样全局都能直接用:$autoload['libraries'] = array('settings');或者在控制器里手动加载:
$this->load->library('settings');获取数据:
在控制器或视图里直接调用:// 获取站点名称 $site_name = $this->settings->get('site_name', '默认站点名称'); // 获取Logo路径 $site_logo = $this->settings->get('site_logo', '/assets/default-logo.png'); // 获取所有设置 $all_settings = $this->settings->all();更新数据:
如果需要修改配置:$this->settings->set('site_name', '新的站点名称');
优化建议
缓存优化:如果你的站点配置不经常修改,可以把加载的设置缓存起来,避免每次请求都查数据库。比如用CodeIgniter的缓存类:
private function load_settings() { $cache_key = 'site_settings'; $cached_settings = $this->ci->cache->get($cache_key); if ($cached_settings) { $this->settings = $cached_settings; return; } $query = $this->ci->db->get('site_settings'); if ($query->num_rows() > 0) { foreach ($query->result() as $row) { $this->settings[$row->key] = $row->value; } // 缓存1小时,可调整时间 $this->ci->cache->save($cache_key, $this->settings, 3600); } }记得要在
config.php里开启缓存配置哦。数据类型处理:如果你的设置有不同数据类型(比如布尔值、数字),可以在
get方法里自动转换类型,比如:public function get($key, $default = null) { if (!isset($this->settings[$key])) { return $default; } $value = $this->settings[$key]; // 转换布尔值 if (strtolower($value) === 'true') return true; if (strtolower($value) === 'false') return false; // 转换数字 if (is_numeric($value)) return (float)$value; return $value; }
这样你的Settings库就能很好地管理站点全局数据啦,有其他细节调整的话可以根据自己的业务需求来改~
内容的提问来源于stack exchange,提问作者Kirasiris
相关产品推荐
相关产品推荐

