[关闭]
@52fhy 2016-04-28T11:52:14.000000Z 字数 18110 阅读 617

CI框架笔记_20160402

PHP


一、目录结构

  1. ci_demo
  2. ├─myapp 应用主目录
  3. ├─autoload.php 自定义的自动加载文件(可选)
  4. ├─myapp.php应用入口文件,拷贝index.php得到,注意修改$application_folder = 'myapp';
  5. ├─cache 缓存目录
  6. ├─config 配置目录,包括autoloaddatabaseroutes
  7. ├─controllers 控制器目录,可以分为apiweb部分(命名自定义),也可以不分
  8. ├─api api相关的控制器类
  9. └─web
  10. ├─core 如果在config.php里配置`$config['subclass_prefix'] = 'BASE_'`,则对应的类文件在此,如Base_Controller.php
  11. ├─helpers 自定义帮助类
  12. ├─hooks 自定义钩子类
  13. ├─language
  14. ├─libraries 自定义类库
  15. ├─logs
  16. ├─models 模型类,文件名小写
  17. ├─third_party
  18. └─views 视图类,可以包含子文件夹,建议与控制器类文件夹对应
  19. └─user
  20. ├─common 公共文件目录,包括静态文件、自定义类库
  21. ├─css
  22. ├─images
  23. ├─img
  24. └─report
  25. ├─js
  26. └─lib 第三方类库可以放这里
  27. └─system CI框架核心文件
  28. ├─core
  29. └─compat
  30. ├─database
  31. └─drivers
  32. ├─cubrid
  33. ├─ibase
  34. ├─mssql
  35. ├─mysql
  36. ├─mysqli
  37. ├─oci8
  38. ├─odbc
  39. ├─pdo
  40. ├─postgre
  41. ├─sqlite
  42. ├─sqlite3
  43. └─sqlsrv
  44. ├─fonts
  45. ├─helpers
  46. ├─language
  47. └─libraries
  48. 多个app可以建立多个目录,可以有多个入口文件。
  49. CI3.0支持composer,在最外层可以有vendor目录。

二、控制器

位于application/controllers

命名规则

1.文件名必须是大写字母开头
2.类名必须以大写字母开头
3.文件名与类名名称一致
4.url里类名可以是小写

例如User.php,类名是User。

示例

myapp/controllers/Welcome.php

  1. <?php
  2. defined('BASEPATH') OR exit('No direct script access allowed');
  3. class Welcome extends CI_Controller {
  4. public function index()
  5. {
  6. $this->load->view('welcome_message');
  7. }
  8. }

application/controllers下可以有子目录(可以嵌套多层,不建议)。例如:
application/controllers/api/。访问的时候记得在url里拼上api

  1. http://localhost/ci/myapp.php/Welcome
  2. http://localhost/ci/myapp.php/api/Test

框架自动将url中类的名称首字母大写(core/CodeIgniter.php 406行):

  1. $class = ucfirst($RTR->class);
  1. require_once(APPPATH.'controllers/'.$RTR->directory.$class.'.php');

所以,这样的url也是可以的:

  1. http://localhost/ci/myapp.php/welcome
  2. http://localhost/ci/myapp.php/api/test

父控制器

默认的,父控制器是CI_Controller。建议重新新建个父控制器,例如BASE_Controller,继承自CI_Controller

常用函数

site_url('stu/index') 不能传参数,例如生成:
http://localhost/dada/admin-ci/index.php/stu/index

base_url() 获取应用所在根目录url地址,例如http://localhost/dada/admin-ci/,去掉了入口文件

config_item('item_key') 获取配置值。建议使用配置类访问这些信息:

  1. $this->config->load('filename');
  2. $this->config->item('item name');
  1. 更多函数:
  2. current_url() 当前url
  3. redirect() 重定向
  4. log_message() 打印日志

注意:

site_url() 依赖url类,需要在autoload.php自动加载下: $autoload['helper'] = array('url');

默认控制器

打开 application/config/routes.php 文件来设置默认控制器:

  1. $route['default_controller'] = 'Blog';

_remap()

如果控制器里存在这个方法,URI里的方法(METHOD)就会被替换成_remap方法,但同时接收URI里的方法参数,供后续使用。

  1. if (method_exists($class, '_remap'))
  2. {
  3. $params = array($method, array_slice($URI->rsegments, 2));
  4. $method = '_remap';
  5. }

_remap会废除掉由 URI 片段来决定哪个方法被调用的规则,允许你重新定义调用方法的规则(方法的路由规则)。

那么我们就可以在根控制器里(例如BASE_Controller)使用这个_remap()方法,进行数据的统一收集、输出。

示例:core/BASE_Controller.php

  1. class Web_Controller extends CI_Controller{
  2. public function _remap($method, $params = array()){
  3. if (!method_exists($this, $method)) {
  4. $this->showError('您访问的页面不存在!');
  5. }
  6. //重新接收URI里待访问的方法
  7. $data = call_user_func_array(array($this, $method), $params);
  8. }
  9. }

当然,也可以进行异常捕获等其他功能。下面是API_Controller里的_remap方法,实现了统一接收参数,统一返回json数据。

  1. class API_Controller extends CI_Controller{
  2. public function _remap($method, $params = array())
  3. {
  4. try {
  5. if (!method_exists($this, $method)) {
  6. throw new HException(ErrorInfo::$err_bad_request);
  7. }
  8. $data = call_user_func_array(array($this, $method), $params);
  9. $succ_info = ErrorInfo::$succ;
  10. $result['ecd'] = $succ_info['code'];
  11. $result['msg'] = $succ_info['msg'];
  12. $result['locate'] = $this->_locate;
  13. $result['result'] = $data;
  14. } catch (HException $e) {
  15. $result['ecd'] = $e->getCode();
  16. $result['msg'] = $e->getMessage();
  17. $result['locate'] = $this->_locate;
  18. $result['result'] = $e->getData();
  19. } catch (Exception $e) {
  20. $result['ecd'] = $e->getCode();
  21. $result['msg'] = $e->getMessage();
  22. $result['locate'] = $this->_locate;
  23. $result['result'] = '';
  24. }
  25. if (!empty($e) || $this->_debug) {
  26. // var_dump($e);
  27. }
  28. if (is_object($result['result'])) {
  29. $result['result'] = obj2arr($result['result']);
  30. }
  31. if (empty($result['result'])) {
  32. unset($result['result']);
  33. }
  34. echo json_encode($result);
  35. exit;
  36. }
  37. }

自动加载的父类

默认子类的前缀是CI_,那么会自动加载application/core/CI_Controller.phpcore/CodeIgniter.php 369行):

  1. if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'))
  2. {
  3. require_once APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php';
  4. }
  5. // Add
  6. if (file_exists(BASEPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'))
  7. {
  8. require_once BASEPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php';
  9. }
  10. // End

通过 URI 分段向你的方法传递参数

如果你的 URI 多于两个段,多余的段将作为参数传递到你的方法中。

例如,假设你的 URI 是这样:

  1. example.com/index.php/products/shoes/sandals/123

你的方法将会收到第三段和第四段两个参数("sandals" 和 "123"):

  1. <?php
  2. class Products extends CI_Controller {
  3. public function shoes($sandals, $id)
  4. {
  5. echo $sandals;
  6. echo $id;
  7. }
  8. }

三、路由

pathinfo模式
支持http://52fhy.com/test.php/stu/one1/4 支持纯值的方式
支持http://52fhy.com/test.php/stu/one?uid=2

不支持http://52fhy.com/test.php/stu/one/uid/2 不支持参数是键值对的形式

路由配置参见config/routes.php

简单路由示例

  1. $route['default_controller'] = 'Test/index'; //默认访问的方法
  2. $route['act_1'] = 'Activity/one'; //前面为自定义的url,后面为实际url

四、配置

入口文件也配置部分参数,例如改应用路径。

常用配置文件:

config.php需要改入库文件名
autoload.php自动加载配置
database.php配置数据库
routes.php路由配置文件
memcached.php缓存配置

当然可以自己新建配置文件。

小技巧:

在config.php里配置$config['subclass_prefix'] = 'BASE_';
那么应用里core里以BASE_开头的类会被自动加载,且controllers或者models里面的类必须继承自core里的类。

config.php常见配置:

  1. //自定义core类前缀
  2. $config['subclass_prefix'] = 'BASE_';
  3. //url正则配置,如果不正确,改成如下:
  4. $config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-,';
  5. //cookie配置
  6. $config['cookie_prefix'] = "";
  7. $config['cookie_domain'] = "";
  8. $config['cookie_path'] = "/";
  9. $config['cookie_secure'] = FALSE;
  10. $config['global_xss_filtering'] = FALSE;

autoload.php常见配置:

  1. //使用session库
  2. $autoload['libraries'] = array('session');
  3. //自动加载helper类
  4. $autoload['helper'] = array('url', 'file', 'string', 'date');

五、模型

所在目录

默认是在APPPATH/models。在core/Loader/php里:

  1. /**
  2. * List of paths to load libraries from
  3. *
  4. * @var array
  5. */
  6. protected $_ci_library_paths = array(APPPATH, BASEPATH);
  7. /**
  8. * List of paths to load models from
  9. *
  10. * @var array
  11. */
  12. protected $_ci_model_paths = array(API_MODEL, ADMIN_MODEL, APPPATH);
  13. /**
  14. * List of paths to load helpers from
  15. *
  16. * @var array
  17. */
  18. protected $_ci_helper_paths = array(APPPATH, BASEPATH);

按照上面的定义,可以自定义。在一个大项目包含多个子项目时,一般model是通用的,那么最好一个公共的位置,例如:common/models

命名规则

默认的规则是:
文件名全部小写,例如user_model.php,类名首字母大写:User_model

载入模型:$this->load->model('User_model');第二个参数是别名
使用模型:$data = $this->User_model->getAll();

如果想使用驼峰命名规则:(推荐)
例如:UserModel.php

$this->UserModel->getById();
则需要对system/core/Loader.php里的model()方法进行修改:屏蔽掉

  1. $model = ucfirst(strtolower($model));

就可以保持类名和文件名大小写一致了。下面的示例假设Modle都已经更改为驼峰命名了。

如何使用模型

方式一:控制器直接使用

示例:myapp/controllers/Welcome.php

  1. public function t() {
  2. //载入模型
  3. $this->load->database();
  4. //获取articles表里的所有数据并以数组形式返回
  5. return $this->db->get('articles')->result_array();
  6. }

默认如果未全局加载database类,需要$this->load->database();

如果您需要一个在整个项目中都起作用的特定模型,您可以让CI在初始化时自动装载它。实现的方法是打开 application/config/autoload.php 文件,然后在自动装载数组中添加上这个模型。

  1. $autoload['libraries'] = array('database');

方式二:间接使用模型文件

上面访问数据是最简单的了,不需要建立任何模型文件。但这种方法不推荐使用,不符合MVC模式。

现在我们通过建立模型文件,在控制器里间接使用。

1、建立模型
示例:myapp/models/UserModel.php

  1. class UserModel extends CI_Model{
  2. function get_last_user()
  3. {
  4. $query = $this->db->get('user', 10); //user表
  5. return $query->result();
  6. }
  7. }

2、控制器里使用
在控制器里加载并使用:

  1. $this->load->model('UserModel');
  2. $this->UserModel->get_last_user();

方式三:优化模型

但感觉还是不方便。原因:
1、到处在使用$this->db不方便维护;
2、不推荐直接继承CI_Model

下面我们进行优化:

1、重写自己的父Model

core/Model.php

可以看到,模型的基类是CI_Model,建议重新建立个父类Model继承CI_Model

这里我们建立了API_Model继承CI_Model。并添加一些公用的方法。

示例:

  1. class API_Model extends CI_Model
  2. {
  3. protected $table;
  4. protected static $db = null;
  5. protected static $db_name = null;
  6. protected $_create_time = true;
  7. protected $_update_time = true;
  8. protected $_id = true;
  9. public function add($data)
  10. {
  11. if($this->_create_time){
  12. $data['create_time'] = now();
  13. }
  14. if($this->_update_time){
  15. $data['update_time'] = now();
  16. }
  17. $db = $this->getDBHanlder();
  18. $db->insert($this->table, $data);
  19. $id = $db->insert_id();
  20. if ($id && $this->_id) {
  21. return $this->getById($id);
  22. }
  23. return (object)$data;
  24. }
  25. public function updateById($id, $data)
  26. {
  27. $db = $this->getDBHanlder(Enum_DB_Name::MASTER);
  28. return $db->where(array('id' => $id))->update($this->table, $data);
  29. }
  30. public function updateByParams($where, $data)
  31. {
  32. $db = $this->getDBHanlder(Enum_DB_Name::MASTER);
  33. $this->bulidWhere($where, $db);
  34. return $db->update($this->table, $data);
  35. }
  36. public function deleteByParams($where)
  37. {
  38. $db = $this->getDBHanlder(Enum_DB_Name::MASTER);
  39. $this->bulidWhere($where, $db);
  40. return $db->delete($this->table);
  41. }
  42. public function getById($id)
  43. {
  44. if (empty($id)) return array();
  45. return $this->getDBHanlder(Enum_DB_Name::SLAVE)->get_where($this->table, array('id' => $id))->row();
  46. }
  47. /**
  48. * @param array $where
  49. * @param array $order($orderby, $direction = '')
  50. */
  51. public function getByParams($where = array(), $orders = array(), $offset = NULL , $limit = NULL)
  52. {
  53. $db = $this->getDBHanlder(Enum_DB_Name::SLAVE);
  54. $this->bulidWhere($where, $db);
  55. if($orders) $db->order_by($orders[0], $orders[1]);
  56. return $db->get($this->table, $limit, $offset)->row();
  57. }
  58. /**
  59. * @param array $where
  60. * @param array $order($orderby, $direction = '')
  61. */
  62. public function listByParams($where = array(), $orders = array(), $offset = NULL , $limit = NULL)
  63. {
  64. $db = $this->getDBHanlder(Enum_DB_Name::SLAVE);
  65. $this->bulidWhere($where, $db);
  66. if($orders) $db->order_by($orders[0], $orders[1]);
  67. return $db->get($this->table, $limit, $offset)->result();
  68. }
  69. public function getCountByParams($where = array())
  70. {
  71. $db = $this->getDBHanlder(Enum_DB_Name::SLAVE);
  72. $this->bulidWhere($where, $db);
  73. return $db->count_all_results($this->table);
  74. }
  75. /**
  76. * Execute the query, return row object
  77. * @param string $sql
  78. * @param array $binds = FALSE An array of binding data
  79. * @param bool $return_object = FALSE
  80. * @return mixed
  81. */
  82. public function query($sql, $binds = FALSE, $return_array = FALSE){
  83. if($return_array){
  84. return $this->getDBHanlder(Enum_DB_Name::SLAVE)
  85. ->query($sql, $binds)
  86. ->row_array();
  87. }else{
  88. return $this->getDBHanlder(Enum_DB_Name::SLAVE)
  89. ->query($sql, $binds)
  90. ->row();
  91. }
  92. }
  93. /**
  94. * Execute the query, return rows object
  95. * @param string $sql
  96. * @param array $binds = FALSE An array of binding data
  97. * @param bool $return_object = FALSE
  98. * @return mixed
  99. */
  100. public function querys($sql, $binds = FALSE, $return_array = FALSE){
  101. if($return_array){
  102. return $this->getDBHanlder(Enum_DB_Name::SLAVE)
  103. ->query($sql, $binds)
  104. ->result_array();
  105. }else{
  106. return $this->getDBHanlder(Enum_DB_Name::SLAVE)
  107. ->query($sql, $binds)
  108. ->result();
  109. }
  110. }
  111. /**
  112. * 获取数据库对象
  113. */
  114. public function getDBHanlder($db_name = Enum_DB_Name::MASTER)
  115. {
  116. if(is_null(self::$db)
  117. ){
  118. self::$db = $this->load->database($db_name, true);
  119. }
  120. return self::$db;
  121. }
  122. /**
  123. * 解析where
  124. * 支持:普通键值对参数、k__in, k__nin查询
  125. */
  126. protected function bulidWhere($where, &$db) {
  127. if($where){
  128. foreach($where as $k=>$v){
  129. if(strpos($k, '__')){
  130. $temp = explode('__', $k);
  131. if($temp[1] == 'in'){
  132. $db->where_in($temp[0] ,$v);
  133. }
  134. if($temp[1] == 'nin'){
  135. $db->where_not_in($temp[0] ,$v);
  136. }
  137. if($temp[1] == 'like'){
  138. $db->like($temp[0] ,$v, 'both');
  139. }
  140. if($temp[1] == 'llike'){
  141. $db->like($temp[0] ,$v, 'before');
  142. }
  143. if($temp[1] == 'rlike'){
  144. $db->like($temp[0] ,$v, 'after');
  145. }
  146. unset($where[$k]);
  147. }
  148. }
  149. $db->where($where);
  150. }
  151. }
  152. }

其中:

  1. abstract class Enum_DB_Name
  2. {
  3. const MASTER = 'master';
  4. const SLAVE = 'slave';
  5. }

2、建立子模型

示例:myapp/models/UserModel.php

  1. class UserModel extends API_Model{
  2. protected $table = 'user';
  3. function get_last_user(){
  4. $query = $this->listByParams(array(
  5. 'flag' => 1
  6. ),array('id','desc'), 0 , 10);
  7. return $query;
  8. }
  9. function getUser($uid){
  10. $query = $this->getById($uid);
  11. return $query;
  12. }
  13. function updUser($uid, $data){
  14. $this->updateById($uid, $data);
  15. }
  16. function addUser($data){
  17. $this->add($data);
  18. }
  19. function delUser($uid){
  20. $this->deleteByParams(array('id' => $uid));
  21. }
  22. }

是不是发现使用的时候简单多了?不用总是写表名,不用总是$this->db。当然,上面的API_Model不是最终的,大家可以自行优化。

3、控制器里使用
与方式二相同。

数据库操作

下面提供了常见的数据库的CURD操作示例:

  1. $this->db->insert('user', $data);
  2. $insert_id = $this->db->insert_id();
  3. $this->db->delete('user', array('id' => $uid));
  4. $this->db->get('user')->result_array();
  5. $this->db->get_where('user', array('id'=> $uid))->row_array();
  6. 普通查询 :query() 函数以object(对象)的形式返回一个数据库结果集.
  7. $querys = $this->db->query('select * from user'); //返回结果集,与get()或者get_where()一致,等同于
  8. $querys = $this->db->get('user');
  9. $this->db->select();
  10. $this->db->select('id,name')->get('user'); //支持选择查询字段,可以连贯查询
  11. $data = $this
  12. ->where(array('uids !=' => $uid))
  13. ->where_in('flag', $flag_map)
  14. ->like('gps_geo', substr($geo, 0, 4), 'after')
  15. ->order_by('book_time', 'desc')
  16. ->limit(10, 0)
  17. ->get($this->table)
  18. ->result_array();
  19. $this->db->where();
  20. $querys = $this->db->select('id,name')->where('id !=', 1)->get('user');
  21. 注意运算符,与ThinkPHP不一样。不管是数组还是键值对,条件都写在键里,使用!=,>=等
  22. 更多:
  23. $this->db->or_where();本函数与上面的那个几乎完全相同,唯一的区别是本函数生成的子句是用 OR 来连接的:
  24. $this->db->where_in();生成一段 WHERE field IN ('item', 'item') 查询语句,如果合适的话,用 AND 连接起来。
  25. $this->db->or_where_in();
  26. $this->db->where_not_in();
  27. $this->db->or_where_not_in();
  28. $this->db->like('title', 'match');
  29. $this->db->or_like();
  30. $this->db->not_like();
  31. $this->db->or_not_like();
  32. $this->db->group_by();
  33. $this->db->distinct();
  34. $this->db->having();
  35. $this->db->order_by();
  36. $this->db->limit();
  37. $this->db->where()->count_all_results();
  38. 获得某个特定的Active Record查询所返回的结果数量,与$this->db->count_all('stu');不同
  39. 查询辅助函数:
  40. $this->db->insert_id() 新增字段Id
  41. $this->db->affected_rows() 当执行写入操作(insert,update等)的查询后,显示被影响的行数。
  42. $this->db->count_all('stu') 计算出指定表的总行数并返回。实际:SELECT COUNT(*) AS `numrows` FROM `stu`
  43. $this->db->last_query() 返回最后运行的查询语句
  44. 结果集方法:
  45. num_rows()记录数统计
  46. row()单行数据,对象格式
  47. result()全部数据,对象格式
  48. row_array()单行数据,数组格式
  49. result_array()全部数据,数组格式
  50. 封装查询
  51. $sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
  52. $this->db->query($sql, array(3, 'live', 'Rick'));
  53. $this->db->update('user', $data, array('id' => $uid));

事务

自动事务

传统上, 事务需要实现大量工作, 他们要求你随时跟踪你的查询, 并根据查询的成功或失败来决定 提交 还是 回滚。这是特别麻烦的嵌套查询。相比之下, 我们实现了一种智能的事务系统, 它将自动地为你做这些事情(如果你选择手动管理你的事务, 这也是可以的, 但这确实没什么好处)。

要使用事务来运行你的查询, 你可以使用如下所述的 $this->db->trans_start()$this->db->trans_complete() 函数:

  1. $this->db->trans_start();
  2. $this->db->query('一条SQL查询...');
  3. $this->db->query('另一条查询...');
  4. $this->db->query('还有一条查询...');
  5. $this->db->trans_complete();

在 start/complete 函数之间, 你想运行多少条查询都可以, 根据任何给定查询的成功或失败, 它们将被提交或者回滚。

手动运行事务

  1. $this->db->trans_begin();
  2. try{
  3. $this->db->query('AN SQL QUERY...');
  4. $this->db->query('ANOTHER QUERY...');
  5. $this->db->query('AND YET ANOTHER QUERY...');
  6. $this->db->trans_commit();
  7. }catch(Exception $e){
  8. $this->db->trans_rollback();
  9. }

说明: 手动运行事务时, 请务必使用 $this->db->trans_begin() 函数, 而不是 $this->db->trans_start().

六、视图

使用方法:

  1. $this->load->vars("list",$data);//不使用模板引擎,ci默认分配变量方式
  2. $this->load->view("index"); //可以包含子目录

建议抽出页面的公共部分,例如header、footer。然后在页面直接引入就可以了。

  1. <?php include_once VIEWPATH . '/header.php' ?>

七、系统类库及函数调用

1. 载入类库

  1. 加载系统类库:
  2. $this->load->library('className'); //使用system/libraries文件夹类库
  3. $this->load->library(array('email', 'table')); //多个类库可以通过传递包含类库的数组一次加载
  4. $this->className->func(); //直接调用加载类的方法
  5. 如果加载类库时指定了第二个参数,则:
  6. $this->load->library('className', 'myClass');
  7. $this->myClass->func();
  8. 加载自定义类库:
  9. 同样使用$this->load->library()加载。
  10. 一般位于application/libraries文件夹下。如果与系统类重名,将覆盖系统类(除了数据库类无法被扩展或替换,剩余其他类均可)。
  11. 命名规则:
  12. 文件名首字母大写. 例如: Myclass.php
  13. 类声明首字母大写. 例如: class Myclass
  14. 类的名字和文件名应相同.
  15. 可以扩展现有类:
  16. 新扩展的类所在的文件必须以 MY_ 为前缀(这个选项是可配置的).扩展的类必须继承父类.

2. 载入辅助函数

  1. $this->load->helper('name');
  2. $this->load->helper( array('helper1', 'helper2', 'helper3') ); //同时载入多个
  3. 辅助函数文件一般保存在 system/helpers application/helpers 文件夹中。CodeIgniter 将会先在 application/helpers 寻找对应的辅助函数文件, 如果目录不存在或者目录下没有对应的辅助函数文件,CI 才会载入 system/helpers 下的辅助函数文件。与$this->load->library()载入规则相同。

3. 载入模型

  1. $this->load->model('Model_name');
  2. 如果模型文件在子文件夹下,引用的时候要带上相对路径名,示例:
  3. $this->load->model('blog/queries');
  4. 模型一旦被载入,你就能通过下面的方法使用它:
  5. $this->Model_name->function();

4. 载入视图

  1. $this->load->view('name');
  2. $this->load->view('name',$data); //同时赋予数据
  3. $buffer = $this->load->view('blogview', $data, true); //不输出而是返回数据

5. 载入配置文件

  1. $this->config->load('filename');
  2. $this->config->load('blog_settings', TRUE); //重复时合并
  3. 从配置文件中检索元素,使用下面的函数:
  4. $this->config->item('itemName');
  5. 动态设置/改变一个现有的配置元素:
  6. $this->config->set_item('item_name', 'item_value');
  7. 自动加载:
  8. 要自动加载配置,请打开文件 autoload.php,它在 application/config/autoload.php,然后按照文件中的提示增加你想要自动加载的配置文件。

八、其它

将Session数据存入数据库

由于Session数据数组是附带一个Session ID保存在用户cookie里的,你无法验证它,除非你把session数据存储在数据库中。在一些不需要或很少需要安全保护的应用中,session ID 或许并不需要。

但如果你的应用需要安全保护,验证是必须的。否则,用户可以通过篡改Cookies来恢复旧的Session。

当session 数据在数据库中可用时,每当从用户cookie中发现一个有效的session,一个数据库查询就会被执行以匹配它。如果 session ID 不相配,session 就会被销毁。Session ID永远不会更新,它们只会在一个新的会话创建时生成。

为了存储session,你必须先创建一个数据表。这是 session 类所需的基本结构(用于MySQL的):

  1. CREATE TABLE IF NOT EXISTS `ci_sessions` (
  2. session_id varchar(40) DEFAULT '0' NOT NULL,
  3. ip_address varchar(45) DEFAULT '0' NOT NULL,
  4. user_agent varchar(120) NOT NULL,
  5. last_activity int(10) unsigned DEFAULT 0 NOT NULL,
  6. user_data text DEFAULT '' NOT NULL,
  7. PRIMARY KEY (session_id),
  8. KEY `last_activity_idx` (`last_activity`)
  9. );

注意: 默认情况下这个表叫做 ci_sessions。可以更改:
myapp/config/config.php

  1. //session
  2. //开启seesion存储到数据库的时候需要配置
  3. $config['sess_driver'] = 'database'; //开启database驱动
  4. $config['sess_cookie_name'] = 'qy-sessions';
  5. $config['sess_expiration'] = 60 * 60 * 24 * 365;
  6. $config['sess_expire_on_close'] = FALSE;
  7. $config['sess_encrypt_cookie'] = TRUE;
  8. $config['sess_use_database'] = TRUE;
  9. $config['sess_table_name'] = 'ci_sessions';
  10. $config['sess_match_ip'] = FALSE;
  11. $config['sess_match_useragent'] = FALSE;
  12. $config['sess_time_to_update'] = 300;

这样就可以使用$this->session操作session了,会存储到数据库。

  1. //设置seesion
  2. $this->session->set_userdata($array);
  3. //获取session
  4. $this->session->userdata('item');
  5. //删除session
  6. $this->session->unset_userdata('some_name');

CI框架中site_url()的原理

  1. var_dump($_SERVER['HTTP_HOST']);
  2. var_dump($_SERVER['SCRIPT_NAME']);
  3. var_dump($_SERVER['SCRIPT_FILENAME']);
  4. var_dump(basename($_SERVER['SCRIPT_FILENAME']));
  5. string 'localhost' (length=9)
  6. string '/dada/admin-ci/test.php' (length=23)
  7. string 'D:/phpsetup/www/htdocs/dada/admin-ci/test.php' (length=45)
  8. string 'test.php' (length=8)
  9. $base_url = (is_https() ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST']
  10. .substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'], basename($_SERVER['SCRIPT_FILENAME'])));
  11. //http://localhost/dada/admin-ci/

区块注释

  1. @deprecated 3.0.0 废弃方法

zend编辑器识别超级类方法

在父级控制器里加上

  1. /**
  2. * @property CI_Loader $load
  3. * @property CI_DB_query_builder $db
  4. * @property CI_Calendar $calendar
  5. * @property CI_Email $email
  6. * @property CI_Encrypt $encrypt
  7. * @property CI_Ftp $ftp
  8. * @property CI_Hooks $hooks
  9. * @property CI_Image_lib $image_lib
  10. * @property CI_Input $input
  11. * @property CI_Language $language
  12. * @property CI_Log $log
  13. * @property CI_Output $output
  14. * @property CI_Session $session
  15. * @property CI_Upload $upload
  16. * @property CI_URI $uri
  17. * @property CI_Config $config
  18. */

与ThinkPHP比较

1、限制少,编码自由;
2、适合写API;
3、视图较TP功能弱些,少了很多常量,模板标签基本没有;
4、控制器层少了很多方便的函数,如U(),$this->success(),少了很多常量,如CONTROLLER。实际开发可以自行定义。
5、模型操作比较麻烦,没有D()方法,全局使用$this->db,实例化比较麻烦;每次数据操作需要带表名(可优化);不能获取表名和主键ID

隐藏入口文件

nginx
需要在vhost文件里添加rewrite

  1. location / {
  2. if (!-e $request_filename) {
  3. rewrite ^/(.*)$ /app.php?/$1 last;
  4. break;
  5. }
  6. }

为了多应用能正常访问,如果入口文件为app.php,那么

  1. index app.php

以及location ~ .*\.(php|php5)?$

  1. fastcgi_index app.php;

get_instance()

获取CodeIgniter的一个实例,访问CodeIgniter的原始资源。这个函数返回一个超级对象,这样可以访问model等资源。
在控制器里,直接使用$this引用CI的这个超级对象。当你在自定义类中想使用CodeIgniter原始类时,你可以这样做:

首先,定义CodeIgniter对象赋给一个变量:

  1. $CI =& get_instance();

一旦定义某个对象为一个变量,你就可以使用那个变量名 取代 $this:

  1. $CI =& get_instance();
  2. $CI->load->helper('url');
  3. $CI->load->library('session');
  4. $CI->config->item('base_url');
  5. //etc.
  6. function addUserFav($uid,$type,$iid){
  7. $ci = & get_instance();
  8. $ci->load->model('UserFavModel');
  9. $ci->UserFavModel->addFav($uid,$type,$iid);
  10. }

参考:
CodeIgniter用户指南:http://codeigniter.org.cn/user_guide/index.html

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注