一简介
- Web应用程序框架;
- 开源免费;
- 真正的轻量级框架,核心系统需要的库小,库通过动态请求加载,速度快;
- 采用MVC设计模式;
- 生成url干净,对搜索引擎友好;
- 可扩展性,通过自己的类库和辅助函数来扩展,也可以通过类扩展或系统钩子来实现;
- 不需要模板引擎,直接在标签内写入原生的php代码;
- 动态实例化:组件导入的函数只有在被请求时才会执行,不是全局执行,不包括核心资源;
- 松耦合:组件之间的依赖程度低;
- 组件专一性:一个组件对某个目标的专注程度,每个类和方法都比较独立,重用性高;
二CI的URL
- 移除url中的index.php(example.com/index.php/news/article/my_article):在 .htaccess 文件加一些简单的规则;
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
- 给url添加后缀:通过配置文件$config['url_suffix'] =' '选项来设置url后缀;
三控制器
- 通过url传递参数:url中包括控制器类名/方法名,之后还有的部分即为方法的参数;
- 设置默认控制器:在配置文件route.php中,设置$route['default_controller'] = 'blog';
'blog'即为默认的控制器名称; - 重映射方法:控制器内写入一个_remap()方法,无论url中包含什么参数都调用该方法;
- 数据输出:
- 构造函数:子类中要用构造函数,必须加上parent::_construct();,因为子类会覆盖父类的构造函数,必须手工调用;
- 方法名:注意子类中的方法名不要和父类中方法名同名,不然会覆盖父类的方法;
四视图
- 加载多个视图:同时通过$this->load->view()方法加载多个视图时,视图会被合并到一起(页头视图,页尾视图等);
- 视图存在子目录中:在加载视图时,需要加上子目录名($this->load->view('directory_name/file_name'));
- 可以向视图中添加数组,对象等数据,当添加的是对象时,会将对象中的变量转换为数组;
- 视图中循环输出数据;
<html>
<head>
<title><?php echo $title;?></title>
</head>
<body>
<h1><?php echo $heading;?></h1>
<h3>My Todo List</h3>
<ul>
<?php foreach ($todo_list as $item):?>
<li><?php echo $item;?></li>
<?php endforeach;?>
</ul>
</body>
</html>
- 将视图作为数据返回:将视图以字符串形式返回,方便对视图中数据进行处理;
$string = $this->load->view('myfile', '', TRUE);
五模型
- 模型类和文件名首字母大写,并保证两者名字相同,模型类继承基类CI_Model,如果模型类中写入构造函数,必须要继承父类构造函数(parent::__construct();),否则父类的构造函数会被覆盖;
- 首先加载模型,通过一个同名或不同名的对象来访问模型中的方法进行对于数据的操作;
public function blog()
{
$this->load->model('blog');
$data['query'] = $this->blog->get_last_ten_entries();
$this->load->view('blog', $data);
//$this->load->model('blog', 'bo');
//$this->bo->$this->blog->get_last_ten_entries();
}
- 模型自动加载:当一个模型在整个应用程序中都会被用到,可以在系统初始化时加载该模型,通过在配置文件autoload.php中,将模型添加到$autoload['model'] = array()数组实现;
- 模型加载后并不会自动连接数据库,此时有三种链接数据库方法:
1)在控制器或模型中使用标准的数据库连接方法连接到数据库;
2)在加载模型时,使用第三个参数,会使用配置文件中的数据库链接;
$this->load->model('model_name', '', TRUE);
3)如果不想使配置文件中链接,也可以通过第三参数设置数据库链接;
$config['hostname'] = 'localhost';
$config['username'] = 'myusername';
$config['password'] = 'mypassword';
$config['database'] = 'mydatabase';
$config['dbdriver'] = 'mysqli';
$config['dbprefix'] = '';
$config['pconnect'] = FALSE;
$config['db_debug'] = TRUE;
$this->load->model('model_name', '', $config);
六辅助函数
- 含义:帮我们完成某些特定的功能,每个辅助函数文件都是某一类函数的集合;
- CI默认不会加载辅助函数,当用到时必须手动加载
$this->load->helper('name');
加载后可以在控制器和视图中全局访问,加载辅助函数时去掉文件后缀.php和_helper部分;
- 加载多个辅助函数:通过数据加载多个;
$this->load->helper(
array('helper1', 'helper2', 'helper3')
);
- 自动加载:当某个辅助函数在整个应用程序中都会用到,可以在autoload.php配置文件中的$autoload['helper'] = array()数组中添加;
- 辅助函数扩展:在helpers目录下新建一个文件,文件名和类名相同,但是要加上MY_前缀(这个前缀可以设置,在config.php配置文件中的$config['subclass_prefix'] = 'MY_');
七类库使用
- 系统类库存放于system/libraries/目录下;
- 类库在使用前需要先加载(llibrary);
$this->load->library('class_name');
- 通过数组形式可以同时加载多个类库;
$this->load->library(array('email', 'table'));
- 创建新的类库要遵循以下的原型
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Someclass {
public function some_method()
{
......
}
}
- 类库可以进行创建,扩展和替换;
- 类库初始化传参:当加载类库时,使用第二参数动态传递数据,此时必须将参数传递到构造函数中,因此定义构造函数时必须加上参数.也可以在config目录下新建一个与类文件同名的配置文件,将参数保存在配置文件中进行传递,此时配置文件将不可用;
$params = array('type' => 'large', 'color' => 'red');
$this->load->library('someclass', $params);
<?php defined('BASEPATH') OR exit('No direct script access allowed');
class Someclass {
public function __construct($params)
{
// Do something with $params
}
}
- 使用CI的原生资源:通过get_instance()函数实现.通常情况下通过$this来调用,当想要在自己的类中使用CodeIgniter时,可以使用get_instance()方法将CodeIgniter对象复制给一个变量,通过这个变量来调用方法;
$CI =& get_instance();
$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
- get_instance()是通过引用传递来实现,引用赋值允许使用CodeIgniter对象,但并不是创建一个新的对象;
- 扩展类库同模型一样
八驱动器
- 驱动器是一种特殊的类库,他有一个父类和多个子类;
- 驱动器保存在system/libraries/目录下,每个驱动器有一个独立的目录,目录名和 驱动器父类的类名一致;
- 驱动器使用:
首先在控制器中初始化
$this->load->driver('class_name');
通过驱动器类名class_name来加载驱动器
$this->load->driver('some_parent');
通过some_parent调用该类的方法
$this->some_parent->some_method();
- 对于子类,不用初始化,可以直接通过父类调用
$this->some_parent->child_one->some_method();
网友评论