【军哥谈CI框架】之入门教程之第二讲:分析CI结构和CI是怎么工作的

时间:2022-09-05 23:47:26

【军哥谈CI框架】之入门教程之第二讲:分析CI结构和CI是怎么工作的

 
之入门教程之第二讲:分析CI结构和CI是如何工作的
大家好!上一节,我们共同部署了一个CI网站,做到这一点非常简单,但是,亲们,要知道这才刚刚开始额~~~

这一节,我们主要来了解CI的文件结构和CI是如何工作的。这一点特别的重要!

一、CI的文件结构
了解CI的文件结构可以帮助我们快速的对CI框架有一个整体的认识,就好像我们去了一个陌生的城市一样,对你来讲周围的一切都是陌生和未知的,要想快速的了解这座城市,你可以买一张这座城市的地图,整体的了解这座城市的方位、结构和风景等等之类的。

二、CI是如何工作的
我们不光要对CI框架要有一个整体的认识,同时还要清楚CI是如何工作的,这样才能快速的掌握和运用CI,还拿刚才去一个陌生城市来说吧,如果你想很快的适应和融入这座城市,是否我们有必要知道一些关于这座城市的风土人情和文化习俗呢。我想还是很有必要的吧,毕竟我们得入乡随俗呀。
当然,军哥这里只是简单的介绍一下,让大家有一个大概的思维认知。

1、CI的文件结构。
大家还记得第一讲中的CI目录结构图吗,当时并没怎么详细说明,我们再来看一下。
【军哥谈CI框架】之入门教程之第二讲:分析CI结构和CI是怎么工作的

【军哥谈CI框架】之入门教程之第二讲:分析CI结构和CI是怎么工作的【军哥谈CI框架】之入门教程之第二讲:分析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”页面。结果如图所示:

【军哥谈CI框架】之入门教程之第二讲:分析CI结构和CI是怎么工作的
另外需要进一步说明的是上述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框架】之入门教程之第二讲:分析CI结构和CI是怎么工作的的更多相关文章

  1. Veins(车载通信仿真框架)入门教程(四)——调试及记录结果

    Veins(车载通信仿真框架)入门教程(四)——调试及记录结果 在Veins入门教程(三)最后的动图中(如下图)可以看到大大小小的光圈,这个怎么实现的呢? 很简单,以收到RTS消息为例,通过finHo ...

  2. Veins(车载通信仿真框架)入门教程(三)——多跳路由实现指导

    Veins(车载通信仿真框架)入门教程(三)——多跳路由实现指导 Veins(车载通信仿真框架)入门教程(三)——多跳路由实现指导 必要的message类实现 从下面开始是在veins/src/vei ...

  3. Veins(车载通信仿真框架)入门教程(二)——调用第三方库

    Veins(车载通信仿真框架)入门教程(二)——调用第三方库 在借助Veins进行自己的研究时我们经常需要实现一些比较复杂的功能,有时就需要借助第三方库的帮助. 博主的研究需要使用神经网络,但是自己编 ...

  4. ArcGIS for Desktop入门教程&lowbar;第二章&lowbar;Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区 1 Desktop简介 1.1 ArcGIS for Desktop ...

  5. 《ArcGIS Engine&plus;C&num;实例开发教程》第二讲 菜单的添加及其实现

    原文:<ArcGIS Engine+C#实例开发教程>第二讲 菜单的添加及其实现 摘要:在上一讲中,我们实现了应用程序基本框架,其中有个小错误,在此先跟大家说明下.在“属性”选项卡中,我们 ...

  6. 【军哥谈CI框架】之CI中集成百度UEditor

    Hello,各位亲,新的一周来临啦,很高兴这么快又跟大家伙见面!话说上一回,军哥带大家用JQuery写了一个城市级联菜单的例子 ,不知道亲们学会了多少,是否自己可以独立写出来了呢. 军哥很是期待大家学 ...

  7. Bootstrap框架菜鸟入门教程

    Bootstrap菜鸟入门教程 Bootstrap简介 Bootstrap,来自 Twitter,是目前最受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,它简 ...

  8. Veins(车载通信仿真框架)入门教程

    Veins入门教程——教你如何下手研究 目录 Veins入门教程——教你如何下手研究 目录 废话少说! 讲解omnetpp.ini!(挑关键的) 讲解RSUExampleScnario.ned! 注意 ...

  9. ReactiveCocoa入门教程:第二部分

    翻译自:http://www.raywenderlich.com/62796/reactivecocoa-tutorial-pt2 原文链接: ReactiveCocoa 是一个框架,它允许你在你的i ...

随机推荐

  1. javascript平时小例子⑦&lpar;鼠标跟随的div&rpar;

    <!doctype html><html> <head> <meta charset="utf-8"> <title>无 ...

  2. &lbrack;转&rsqb;Linux命令的返回值

    Linux命令的返回值 对于某些监测脚本和探测命令蛮有用的: 在 Linux 下,不管你是启动一个桌面程序也好,还是在控制台下运行命令,所有的程序在结束时,都会返回一个数字值,这个值叫做返回值,或者称 ...

  3. 冲刺阶段 day1

    Day 1 项目进展: 通过之前的项目学习,我们已经对我们的耿丹师生基本信息系统项目有了一个方向,又通过昨天和今天的站立会议,大体的编程安排也已经确定了下来,按照之前的编程分工,大家已经开始进行.首先 ...

  4. django-cms 代码研究(六)plugin的深入分析

    示例代码: https://github.com/divio/djangocms-picture 以上一个图片的插件,安装后可在页面中添加图片,效果如下图: 以此为切入点,分析plugin的逻辑: 分 ...

  5. ios短信和电话--参考

    调用打电话功能 [[UIApplicationsharedApplication] openURL:[NSURL URLWithString:@"tel://10086"]]; 调 ...

  6. C&num;学习日志 day8 -------------- async await 异步方法入门(引用博客)以及序列化和反序列化的XML及json实现

    首先是异步方法的介绍,这里引用自http://www.cnblogs.com/LoveJenny/archive/2011/11/01/2230933.html async and await 简单的 ...

  7. QT listwiget 控件添加图片

    很多的时候我们需要制作类似手机的中的电子相框, 可以用listwidget 控件实现 直接上代码 MainWindow::MainWindow(QWidget *parent) : QMainWind ...

  8. iOS如何接收服务端返回的布尔值

    if ([user[@"chat"] boolValue]) { userModel.chat = ; }else { userModel.chat = ; } 关键是要调用boo ...

  9. java内存溢出分析工具

    http://www.cnblogs.com/preftest/archive/2011/12/08/2281322.html java内存溢出分析工具:jmap使用实战 在一次解决系统tomcat老 ...

  10. JavaScript文件引入方式区别

    1.JavaScript文件引入方式 (1)正常引入 <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js&quo ...