CodeIgniter学习笔记
概览
应用程序流程图
-
index.php
文件作为前端控制器,初始化运行CodeIgniter
所需的基本资源; -
Router
检查HTTP
请求,以确定如何处理该请求; - 如果存在缓存文件,将直接输出到浏览器,不用走下面正常的系统流程;
- 在加载应用程序控制器之前,对
HTTP
请求以及任何用户提交的数据进行安全检查; - 控制器加载模型、核心类库、辅助函数以及其他所有处理请求所需的资源;
- 最后一步,渲染视图并发送至浏览器,如果开启了缓存,视图被会先缓存起来用于 后续的请求。
模型-视图-控制器
CodeIgniter
的开发基于 MVC
(模型-视图-控制器)设计模式。MVC
是一种 用于将应用程序的逻辑层和表现层分离出来的软件方法。在实践中,由于这种分离 所以你的页面中只包含很少的 PHP
脚本。
- 模型 代表你的数据结构。通常来说,模型类将包含帮助你对数据库进行增删改查的方法。
-
视图 是要展现给用户的信息。一个视图通常就是一个网页,但是在
CodeIgniter
中, 一个视图也可以是一部分页面(例如页头、页尾),它也可以是一个RSS
页面, 或其他任何类型的页面。 -
控制器 是模型、视图以及其他任何处理
HTTP
请求所必须的资源之间的中介,并生成网页。
常规主题
CodeIgniter URL
CodeIgniter
中的 URL
被设计成对搜索引擎和人类友好,使用基于段的写法:
example.com/news/article/my_article
URI 分段
example.com/class/function/ID
- 第一段表示要调用的控制器 类 ;
- 第二段表示要调用的类中的 函数 或 方法 ;
- 第三段以及后面的段代表传给控制器的参数,如
ID
或其他任何变量;
移除URL中的index.php
默认情况,你的 URL 中会包含 index.php
文件:
example.com/index.php/news/article/my_article
你可以简单的通过一个 .htaccess
文件再加上一些简单的规则就可以移除 index.php
:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
在上面的例子中,除已存在的目录和文件,其他的 HTTP 请求都会经过你的 index.php
文件。
启用查询字符串
有些时候,你可能更喜欢使用查询字符串格式的 URL:
index.php?c=products&m=view&id=345
可以在 application/config.php
配置文件中启用它。 打开配置文件,查找下面这几项:
$config['enable_query_strings'] = FALSE;
$config['controller_trigger'] = 'c';
$config['function_trigger'] = 'm';
只要把 enable_query_strings
参数设为 TRUE
即可启用该功能。然后通过你设置的 trigger
关键字来访问你的控制器和方法:
index.php?c=controller&m=method
控制器
什么是控制器?
简而言之,一个控制器就是一个类文件,是以一种能够和 URI
关联在一起的方式来命名的。
文件名必须是大写字母开头,如:Blog.php
,同时类名必须以大写字母开头。
另外,一定要确保控制器继承了父控制器类,这样它才能使用父类的方法。
定义默认控制器
CodeIgniter
可以设置一个默认的控制器,当 URI
没有分段参数时加载,例如当用户直接访问你网站的首页时:
//文件位于application/config/routes.php
$route['default_controller'] = 'blog';
重映射方法
URI
的第二段通常决定控制器的哪个方法被调用。CodeIgniter
允许你使用 _remap()
方法来重写该规则,即定义自己的路由规则:
//方法名之后的所有其他段都会作为参数传递进去
public function _remap($method)
{
if ($method === 'some_method')
{
$this->$method();
}
else
{
$this->default_method();
}
}
注意:如果你的控制包含一个 _remap()
方法,那么无论 URI
中包含什么参数时都会调用该方法。
构造函数
如果你打算在你的控制器中使用构造函数,你 必须 将下面这行代码放在里面:
parent::__construct();
原因是你的构造函数将会覆盖父类的构造函数,所以我们要手工的调用它。
视图
简单来说,一个视图其实就是一个 Web
页面,或者页面的一部分,像页头、页脚、侧边栏等。
视图不是直接被调用的,它必须通过控制器来加载。
加载视图
$this->load->view('name');
name
参数为你的视图文件名。
注意:文件的扩展名 .php
可以省略,除非你使用了其他的扩展名。
加载多个视图
CodeIgniter
可以智能的处理在控制器中多次调用 $this->load->view()
方法。 如果出现了多次调用,视图会被合并到一起。
向视图添加动态数据
通过视图加载方法的第二个参数可以从控制器中动态的向视图传入数据, 这个参数可以是一个 数组或者一个 对象 。这里是使用数组的例子:
$data = array(
'title' => 'My Title',
'heading' => 'My Heading',
'message' => 'My Message'
);
$this->load->view('blogview', $data);
这里是使用对象的例子:
$data = new Someclass();
$this->load->view('blogview', $data);
注意:当你使用对象时,对象中的变量会转换为数组元素。
将视图作为数据返回
加载视图方法有一个可选的第三个参数可以让你修改它的默认行为,它让视图作为字符串返回而不是显示到浏览器中,如果你需要返回的数据, 记住将它赋值给一个变量:
$string = $this->load->view('myfile', '', TRUE);
模型
什么是模型?
模型是专门用来和数据库打交道的 PHP
类。
剖析模型
模型类的基本原型如下:
class Model_name extends CI_Model {
public function __construct()
{
parent::__construct();
// Your own constructor code
}
}
加载模型
你的模型一般会在你的控制器方法中加载并调用,加载之后,你就可以通过一个和你的类同名的对象访问模型中的方法:
$this->load->model('model_name');
$this->model_name->method();
如果你想将你的模型对象赋值给一个不同名字的对象,你可以使用 $this->load->model()
方法的第二个参数:
$this->load->model('model_name', 'foobar');
$this->foobar->method();
链接数据库
当模型加载之后,它 并不会 自动去连接你的数据库。
你可以设置第三个参数为 TRUE
让模型在加载时自动连接数据库,会使用你的数据库配置文件中的配置:
$this->load->model('model_name', '', TRUE);
还可以通过第三个参数传一个数据库连接配置:
$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);
辅助函数
每个辅助函数文件都是某一类 函数的集合。例如, URL 辅助函数 帮助我们创建链接,表单 辅助函数帮助我们创建表单元素,本文辅助函数 帮助我们处理文本的格式化,Cookie 辅助函数 帮助我们读取或设置 Cookie ,文件 辅助函数 帮助我们处理文件,等等等等。
辅助函数没有使用面向对象的方式来实现的。 它们是简单的过程式函数,每个函数处理一个特定的任务,不依赖于其他的函数。
加载辅助函数
可以使用下面的方法简单的加载辅助函数:
$this->load->helper('name');
name
参数为辅助函数的文件名,去掉 .php
文件后缀以及 _helper
部分。
辅助函数可以在你的控制器方法的任何地方加载(甚至可以在你的视图文件中加载,尽管这不是 个好的实践),只要确保在使用之前加载它就可以了。
加载多个辅助函数
如果需要加载多个辅助函数,可以使用一个数组:
$this->load->helper(
array('helper1', 'helper2', 'helper3')
);
使用CodeIgniter类库
在使用之前, 你要先在控制器中初始化它:
$this->load->library('form_validation');
同样,多个类库可以通过一个数组来同时加载。
$this->load->library(array('email', 'table'));
使用CodeIgniter驱动器
驱动器是一种特殊类型的类库,它有一个父类和任意多个子类。子类可以访问父类, 但不能访问兄弟类。
要使用一个驱动器,你可以在控制器中使用下面的方法来进行初始化:
$this->load->driver('class_name');
然后就可以像下面这样调用该类的方法:
$this->some_parent->some_method();
而对于那些子类,我们不用初始化,可以直接通过父类调用了:
$this->some_parent->child_one->some_method();
$this->some_parent->child_two->another_method();
URI路由
通配符
一个典型的使用通配符的路由规则如下:
$route['product/:num'] = 'catalog/product_lookup';
上面的例子中,如果 URL 的第一段是字符串 "product" ,第二段是个数字,那么, 将调用 "catalog" 类的 "product_lookup" 方法。
(:num) 匹配只含有数字的一段。 (:any) 匹配含有任意字符的一段。(除了 '/' 字符,因为它是段与段之间的分隔符)
注意:通配符实际上是正则表达式的别名,:any 会被转换为 [^/]+ , :num 会被转换为 [0-9]+ 。
示例:
$route['product/(:num)'] = 'catalog/product_lookup_by_id/$1';
URL
的第一段是 product
,第二段是数字时,将重定向到 catalog
类的 product_lookup_by_id
方法,并将第二段的数字作为参数传递给它。
正则表达式
一个典型的使用正则表达式的路由规则看起来像下面这样:
$route['products/([a-z]+)/(\d+)'] = '$1/id_$2';
回调函数
你可以在路由规则中使用回调函数来处理逆向引用。例如:
$route['products/([a-zA-Z]+)/edit/(\d+)'] = function ($product_type, $id)
{
return 'catalog/product_edit/' . strtolower($product_type) . '/' . $id;
};
在路由中使用HTTP
动词
还可以在你的路由规则中使用 HTTP
动词(请求方法),当你在创建 RESTful
应用时特别有用。 你可以使用标准的 HTTP
动词(GET
、PUT
、POST
、DELETE
、PATCH
),也可以使用自定义的动词 (例如:PURGE
),不区分大小写。你需要做的就是在路由数组后面再加一个键,键名为 HTTP
动词。例如:
$route['products']['put'] = 'product/insert';
//当发送 DELETE 请求到第一段为 "products" ,第二段为数字这个 URL时,将会调用 Product::delete() 方法,并将数字作为第一个参数。
$route['products/(:num)']['DELETE'] = 'product/delete/$1';
网页缓存
依靠网页缓存, 你的网页可以达到近乎静态网页的加载速度,因为程序的输出结果 已经保存下来了。
缓存是如何工作的?
可以针对到每个独立的页面进行缓存,并且你可以设置每个页面缓存的更新时间。 当页面第一次加载时,缓存将被写入到 application/cache
目录下的文件中去。
开启缓存
将下面的代码放到任何一个控制器的方法内,就可开启缓存:
//其中 $n 是缓存更新的时间(单位分钟)
$this->output->cache($n);
删除缓存
如果你不再需要缓存某个页面,你可以删除掉该页面上的缓存代码,可以使用 delete_cache()
方法:
// Deletes cache for the currently requested URI
$this->output->delete_cache();
// Deletes cache for /foo/bar
$this->output->delete_cache('/foo/bar');
管理你的应用程序
重命名应用程序目录
如果你想重命名应用程序目录,你只需在重命名之后打开 index.php
文件将 $application_folder
变量改成新的名字:
$application_folder = 'application';
在视图文件中使用PHP替代语法
如果你不使用 CodeIgniter
的模板引擎, 那么你就只能在视图文件中使用纯 PHP
语法了。
Echo替代语法
通常情况,你会使用下面的方法来打印一个变量:
<?php echo $variable; ?>
使用替代语法,你可以写成这样:
<?=$variable?>
控制结构替代语法
以下为foreach
的例子:
<ul>
<?php foreach ($todo as $item): ?>
<li><?=$item?></li>
<?php endforeach; ?>
</ul>
注意这里没有任何括号。
以下为 if
/elseif
/else
的例子:
<?php if ($username === 'sally'): ?>
<h3>Hi Sally</h3>
<?php elseif ($username === 'joe'): ?>
<h3>Hi Joe</h3>
<?php else: ?>
<h3>Hi unknown user</h3>
<?php endif; ?>
距离我上次写php
可能已经差不多有一年了,而对于这个CodeIgniter
框架,虽然我当时也只会皮毛,但是重新粗略看了一遍文档后发现有的地方更好理解了,也算是一种进步吧。。。这篇学习笔记可以算的上是从文档中取出来的简单入门教程,虽然完全不够面面俱到,同时对各种类库以及辅助函数等都没有涉及,只能留待用到的时候自行查阅,但是在某些基本的内容上倒是可以作为查阅资料。