CI(CodeIgniter)学习第二讲
了解CI的文件结构可以帮助我们快速的对CI框架有一个整体的认识,就好像我们去了一个陌生的城市一样,对你来讲周围的一切都是陌生和未知的,要想快速的了解这座城市,你可以买一张这座城市的地图,整体的了解这座城市的方位、结构和风景等等之类的。
二、CI是如何工作的。
我们不光要对CI框架要有一个整体的认识,同时还要清楚CI是如何工作的,这样才能快速的掌握和运用CI,还拿刚才去一个陌生城市来说吧,如果你想很快的
适应和融入这座城市,是否我们有必要知道一些关于这座城市的风土人情和文化习俗呢。我想还是很有必要的吧,毕竟我们得入乡随俗呀。
当然,军哥这里只是简单的介绍一下,让大家有一个大概的思维认知。
1、CI的文件结构。
大家还记得第一讲中的CI目录结构图吗,当时并没怎么详细说明,我们再来看一下。
根据上图我们可以知道,CI主要组成部分为,application(应用文件夹)、system(系统文件夹)和index.php入口文件。
应用文件夹中主要是存放控制器、模型和视图等,系统文件夹中主要是存放组成CI的核心文件的,index.php入口文件是一个单一入口文件,所谓单一文件是指在一个网站(应用程序)中,所有的请求都是指向的这么一个文件,由它负责接收并处理URL中的控制器和方法。换句话说, 它调用一个 '控制器', 然后返回一个'视图'。
具体对单一入口文件的介绍我引用了高洛峰老师在BroPHP中对它的一个解释。如下:
单一入口文件:
在使用PHP过程化编程时,每个PHP文件都能独立访问并运行,就像一个体育场有多个入口一样,需要在每个入口都要检票和安全检查。而采用单一入口模式进
行项目部署和访问,无论完成什么功能,一个项目只有一个统一(但不一定是唯一)的入口,就像一个体育场如果只能从一个入口入场(程序是抽象的,一个入口和
多个入口效率是一样的)控制起来则更灵活,几乎没有什么缺点。使用主入口文件部署项目的优点如下:
1、加载文件方便
在编写和阅读过程化程序代码时,经常会遇到文件之间互相包含,其中包括PHP使用include包括函数库和公共资源文件,也包括在HTML中使
用<link>和<script>加载CSS和javaScript文件。项目越大,文件越多越让人感觉头疼,就像一张大网一样
将文件交织在了一起,不容易找到头绪。而使用单一入口则解决这个难题,在项目应用中用到的任何一个文件,只要相对于单一入口文件的位置查找即可。
2、权限验证容易
如果每个PHP文件都可以独立访问,在做用户权限验证时就需要对每个文件进行判断。而采用单一入口则只需要在一个位置进行判断即可。
3、URL重写简单
如果每个PHP文件和不同目录下的PHP文件都可以独立访问,则在Web服务器中对URL进行重新编写时需要很多条规则。而采用单一入口则在URL重写时只需要简单的几条规则即可。
好,接着来具体看application(应用文件夹)、system(系统文件夹)中放了哪些文件以及它们的作用是什么吧。
application :
cache 第一次安装时为空,如果你打开缓存设置,这个目录存放缓存数据
config 存放配置文件,包含网站的基本配置信息
controllers 存放你项目的控制器目录
core 该目录可以扩展系统的核心文件
errors 包含出错信息页,你不必修改这个目录
hooks 首次安装时为空,用来存放你创建的钩子。钩子是 用来装载其它文件的控制方法
helpers 辅助函数,你可以对系统的辅助函数进行扩展
language 存放你本国语言的文件目录
libraries 类库,你可以创建自己的类库
logs 如果你设置打开了系统的错误日志,日志文件就默认保存在这个目录
models 存放你项目的模型目录
views 存放视图的模板目录
system :
core 存放系统核心文件
database CI框架的数据库类的类库文件
fonts 没有在用户手册中介绍,存放水印图像使用的字体
helpers 辅助函数,你可以对系统的辅助函数进行扩展
language 存放英语的文件目录
libraries 存放一些类库的目录,比如SESSION类、分页类、图像类等
应用文件夹(application)中,最重要的文件夹是config,该文件夹内有两个需要关注的文件:config.php 和 database.php。
,其次是controllers、models和views文件夹,分别存储你网站中的控制器、模型和视图。
爱问问题的你可能会纳闷CI为什么要这样来设置文件结构,其实啊,为什么要把代码放在这个目录而不是那个目录是没有什么理由好讲,这就是CI里的一种约定。
另外细心的你是不是又发现application和system有些文件夹是相同的呢,如core、helpers、libraries等。其实这也是由
CI结构约定的, 当你装载一个辅助函数helper, 或类库文件library,
CI会在上述两个目录中查找,比如你要装载一个类叫做无限分类的类Category,
CI会先查找application/libraries目录。如果这个目录中不存在,CI会寻找system/libraries目录。这意味着可以通
过把同名的文件放入application目录来取代CI核心库的libraies,
helpers。但不要轻易尝试这样做,因为这种高度的灵活性需要你拥有足够多的CI使用经验。
2、那CI是如何工作的呢?
上一节我们快速的搭建好了一个CI网站,浏览器成功的显示出一个欢迎界面。我们不禁要问那究竟是如何显示出来的呢?其实根据我们前面对CI的介绍和结构分析之后,我们不难发现这跟CI使用M-V-C模式和单一入口文件有关。
我们来简单分析一下:
例如当我们访问的时候,程序会依靠index.php来做大量的初始化工作,调用大量的基础类库,并根据index.php后面的参数来加载控制器和方
法,然后调用模型,加载视图等内容信息。当然在这个例子当中index.php后面你并没有看到任何参数,但这不代表就没有参数存在,因为CI事先已经默
认指定好了控制器和方法的参数,这个默认的参数可以自己指定,配置文件存放在application/config/routes中,该配置文件中包含下
列设置:
$route['default_controller'] = "welcome";$route['404_override'] =
'';上述config文件,默认的控制器为welcome,如果没有指定方法,index方法会被默认指定。如果请求的控制器或方法不存在,则程序会转
到“404”页面。结果如图所示:
另外需要进一步说明的是上述URL中方法(也称为函数)必须是前面那个控制器中存在的。或则说,你不能够在一个控制器内调用其它控制器内的方法。
我们来总结一下CI处理URL的具体细节(部分摘自CI中国论坛):
假如URL网址为:/control/func/param1/param2/...
URL片段 |
用途 |
定位你网站的基本URL | |
/index.php |
定位CI路由器并读取URL的其它部分,分析后定们到相关网页 |
/control |
CI将调用的控制器的名称(如果没有设置控制器名称,CI将调用你在config文件中设置的默认控制器) |
/func |
CI将调用的函数的名称,位于所调用的控制器内。(如果不存在该函数,默认调用的是index函数,除非你使用_remap) |
/param1 |
CI把这个作为传递给函数的变量 |
如果还有/param2/... |
CI把更多的参数作为变量传递给函数 |
所以上面网址可以理解为:/控制器名/方法名/方法的参数1/方法的参数2/...
总结:军哥对具体CI是如何工作的讲解的还是比较浅显和笼统的,主要目的还是先快速的带大家建立起一个对CI的初步认识,更多的后面会逐渐来深入。
好,这讲就到这吧,下一讲我们来学习如何具体来写一个控制器、方法和视图,然后我们自己写一个大家都懂的例子——“Hello World!”
CI(CodeIgniter)学习第二讲的更多相关文章
- CI(CodeIgniter)学习第一讲
一.CI的优势一. (1).CI是一个PHP框架:大家都知道PHP框架有很多,CI只是其中之一,框架是为了重用发明的.同样,CI的目标是实现让你比从零开始编写代码更快速地开发项目.CI可以将需要完成的 ...
- python学习第二讲,pythonIDE介绍以及配置使用
目录 python学习第二讲,pythonIDE介绍以及配置使用 一丶集成开发环境IDE简介,以及配置 1.简介 2.PyCharm 介绍 3.pycharm 的安装 二丶IDE 开发Python,以 ...
- 购物商城学习--第二讲(maven工程介绍)
接下来第二讲介绍整体工程如何使用maven搭建的. 使用maven管理工程的好处: jar包的管理: 工程之间的依赖管理: 自动打包 maven常见打包方式:jar.war和pom三种.jar工程,是 ...
- android学习-第二讲(修改项目名称和图标,log,过滤器)
一.在app/src/main/res下有 AndroidManifest.xml打开,打开后如下图1 二.日志工具log log.v() log.d() log.i() log.w() lo ...
- 【军哥谈CI框架】之入门教程之第二讲:分析CI结构和CI是怎么工作的
[军哥谈CI框架]之入门教程之第二讲:分析CI结构和CI是怎么工作的 之入门教程之第二讲:分析CI结构和CI是如何工作的大家好!上一节,我们共同部署了一个CI网站,做到这一点非常简单,但是,亲们, ...
- x64汇编第二讲,复习x86汇编指令格式,学习x64指令格式
目录 x64汇编第二讲,复习x86汇编指令格式,学习x64指令格式 一丶x86指令复习. 1.1什么是x86指令. 1.2 x86与x64下的通用寄存器 1.3 OpCode 1.4 7种寻址方式 二 ...
- MySQL实战45讲学习笔记:日志系统(第二讲)
一.重要的日志模块:redo log 1.通过酒店掌柜记账思路刨析redo log工作原理 2.InnoDB 的 redo log 是固定大小的 只要赊账记录在了粉板上或写了账本上,之后即使掌柜忘记了 ...
- PE文件格式详解,第二讲,NT头文件格式,以及文件头格式
PE文件格式详解,第二讲,NT头文件格式,以及文件头格式 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) PS:本篇博客 ...
- MFC原理第二讲.MFC的初始化过程
MFC原理第二讲MFC的初始化过程 一丶简介 通过上一讲.我们手工模拟了一个MFC程序. 但是上一讲留下了疑问. 就是WinMain在哪.以及消息处理在哪里. 这一节主要就是讲解Winmain在哪里. ...
随机推荐
- jquery 获取多个dom对象的方法
$("[name=trade]").each(function(){ for(j=0;j<info.trade.length;j++){ if( $(this).val() ...
- Java学习笔记--Swing用户界面组件
很多与AWT类似. 事件处理参考:Java学习笔记--AWT事件处理 1.设计模式: 模型:存储内容视图:显示内容控制器:处理用户输入· 2. 文本输入常用组件 2.1 文本域: JLabel lab ...
- Uubntu14.04 LST安装NodeJS
1:从官网下载node.js源码http://nodejs.org/download/ 当前最新版为node-v0.10.33 2:安装 $ tar zxvf node-v0.10.33.tar.gz ...
- layout cannot be resolved or is not a field
去除代码activity代码页面顶部中的 import android.R;这句就可以消除红色波浪线的main cannot be resolved or is not a field类似这个错误了
- Qt自定义带游标的slider,在滑块正上方显示当前值(非常有意思,继承QSlider之后增加一个QLabel,然后不断移动它)
首先自定义QSlider的子类MyCustomSlider,如下所示. mycustomslider.h #ifndef MYCUSTOMSLIDER_H #define MYCUSTOMSLIDER ...
- 分布式文件系统glusterfs安装步骤
我的系统是 RHEL5 , 可能环境不一样, 需要安装的第三方依赖不一样啊, 反正大家在安装的过程中缺少什么就去安装什么, 一般都会有提示的. 下载 glusterfs-3.2.0.tar.gz ...
- SSH2.0编程 ssh协议过程实现
之前为了自己做一套SSH,先自己实现了一套telnet.但经过这么多天的苦逼,发现以前的工作都是徒劳.ssh的协议很繁杂,核心的内容在于密码算法,而且自己很难在网上找到周全的细节讲解与详细的实现,只有 ...
- 虚拟机环境中安装ubuntu下的mysql-cluster7.3.2(单点服务器)
部署环境: 系统:ubuntu-12.04.2 LTS -server-i386.iso Cluster:mysql-cluster-gpl-7.3.2-linux-glibc23-i686.ta ...
- linux使用mysql的命令
1.连接到mysql服务器的命令 mysql -h 服务器主机地址 -u 用户名 -p 用户密码 例:mysql -h 192.168.1.1 -u root -p //指定服务器的主机地址和用户 ...
- 表单javascript checkbox全选 反选 全不选
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...