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在哪里. ...
随机推荐
- [转发]Gulp开发教程(翻译)
Building With Gulp =================== 转载出处 原文地址 翻译出处 对网站资源进行优化,并使用不同浏览器测试并不是网站设计过程中最有意思的部分,但是这个过程中的 ...
- javascript第一课练习
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8& ...
- 用Python制作markdown编辑器
还记得在上篇提到的rest-framework,文档中提到了markdown也是可选应用. 那么这篇我们就来尝试使用markdown来制作一个在线的可以预览的editor. 安装 Python Mar ...
- 网上查了点关于windows注册表的知识,发现基本名词没理解好,于是整理这篇笔记(可能个别地方不准确,先这么理解吧),有了这个理解,再去看网上的文章,就差不读了
打开注册表编辑器,左边窗格中显示的是“注册表项”,右边窗格中显示的是“注册表项的项值” 子项:子项是相对父项而言的,在某一个项(父项)下面出现的项(子项) 值项:一个项可以有一个或多个项值,当前被使用 ...
- scala学习笔记-Demo存档
class Thermomenter{ var celsius :Float = _; //将变量设置为缺省值'_',这个符号指定了变量的初始化值 //对数值类型来说是0,布尔类型是false,引用类 ...
- ReactiveCocoa v2.5 源码解析 之 架构总览
ReactiveCocoa 是一个 iOS 中的函数式响应式编程框架,它受 Functional Reactive Programming 的启发,是 Justin Spahr-Summers 和 J ...
- gtest编译小结(ubuntu 12.10 , gtest 1.6.0)
1 下载源码,解压之当前用户的主目录(~/) 2 进入make目录,执行make命令 cd ~/gtest-/make make 3 在ubuntu里编译出错,提示找不到lthread库.修改Make ...
- Keil C51程序设计中几种精确延时方法
1 使用定时器/计数器实现精确延时 单片机系统一般常选用11.059 2 MHz.12 MHz或6 MHz晶振.第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确 ...
- 关于GC的意见
转载:http://tieba.baidu.com/p/3171732371?pid=53949564351&cid=#53949564351 0.这里的GC是指“垃圾回收”(garbage ...
- 图解SSL/TLS协议(转)
本周,CloudFlare宣布,开始提供Keyless服务,即你把网站放到它们的CDN上,不用提供自己的私钥,也能使用SSL加密链接. 我看了CloudFlare的说明(这里和这里),突然意识到这是绝 ...