CodeIgniter学习笔记

CodeIgniter学习笔记

概览

应用程序流程图

CodeIgniter 程序流程
  1. index.php 文件作为前端控制器,初始化运行 CodeIgniter 所需的基本资源;
  2. Router 检查 HTTP 请求,以确定如何处理该请求;
  3. 如果存在缓存文件,将直接输出到浏览器,不用走下面正常的系统流程;
  4. 在加载应用程序控制器之前,对 HTTP 请求以及任何用户提交的数据进行安全检查;
  5. 控制器加载模型、核心类库、辅助函数以及其他所有处理请求所需的资源;
  6. 最后一步,渲染视图并发送至浏览器,如果开启了缓存,视图被会先缓存起来用于 后续的请求。

模型-视图-控制器

CodeIgniter 的开发基于 MVC(模型-视图-控制器)设计模式。MVC 是一种 用于将应用程序的逻辑层和表现层分离出来的软件方法。在实践中,由于这种分离 所以你的页面中只包含很少的 PHP 脚本。

  • 模型 代表你的数据结构。通常来说,模型类将包含帮助你对数据库进行增删改查的方法。
  • 视图 是要展现给用户的信息。一个视图通常就是一个网页,但是在 CodeIgniter 中, 一个视图也可以是一部分页面(例如页头、页尾),它也可以是一个 RSS 页面, 或其他任何类型的页面。
  • 控制器 是模型、视图以及其他任何处理 HTTP 请求所必须的资源之间的中介,并生成网页。

常规主题

CodeIgniter URL

CodeIgniter 中的 URL 被设计成对搜索引擎和人类友好,使用基于段的写法:

example.com/news/article/my_article

URI 分段

example.com/class/function/ID
  1. 第一段表示要调用的控制器
  2. 第二段表示要调用的类中的 函数方法
  3. 第三段以及后面的段代表传给控制器的参数,如 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 动词(GETPUTPOSTDELETEPATCH),也可以使用自定义的动词 (例如: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框架,虽然我当时也只会皮毛,但是重新粗略看了一遍文档后发现有的地方更好理解了,也算是一种进步吧。。。这篇学习笔记可以算的上是从文档中取出来的简单入门教程,虽然完全不够面面俱到,同时对各种类库以及辅助函数等都没有涉及,只能留待用到的时候自行查阅,但是在某些基本的内容上倒是可以作为查阅资料。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352

推荐阅读更多精彩内容

  • 视图控制器管理着构成应用程序用户界面中的一部分视图,其负责加载和处理这些视图,管理与这些视图的交互,并协调视图对其...
    渐z阅读 4,295评论 0 1
  • 很喜欢一句话,婚姻可能是合作,但爱情和付出,也许从来都是自己的事。没有任何一种强势的逼迫和道德的绑架能维持一份长久...
    陈宸宸阅读 256评论 0 0
  • 春季最迷人的穿搭,小编认为休闲类的裤装+小白鞋,可是御姐、软萌妹、女汉纸们的最爱噢(*^__^*) 。各种款式的小...
    山的彼岸阅读 295评论 0 1
  • 闺女上了两天小学就碰到了礼拜六,连休两天,是不是感觉太好了?呵呵,在幼儿园都没有享受到这种待遇,嘻嘻嘻:-P。今天...
  • 今天工作也很累,其他方面也没有起色,英语背单词太糊弄了,明天地铁上一定要巩固,晚上回家感觉累的不行,上厕所因为吃了...
    兆之阅读 112评论 0 0