`
再逢山水
  • 浏览: 157704 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

codeIgniter框架基本结构 (一)

    博客分类:
  • LAMP
阅读更多
1、index.php入口文件:

1)   指定 CodeIgniter 框架所在目录;
2)   定义 APPPATH 常量,指示应用程序文件根目录;
3)   载入 codeigniter/CodeIgniter.php 文件,启动框架。

2、codeigniter/CodeIgniter.php 文件:

主要完成初始化 CodeIgniter 框架和启动应用程序两项工作。
1)   实例化 CI_Benchmark,这个类用于标记应用程序执行消耗的时间;
2)   载入应用程序的配置文件 require(APPPATH.’config/config’.EXT);
3)   实例化 CI_Config,这个类用于将数组封装为可以操作的配置服务;
4)   实例化 CI_Router,这个类用于分析 URL 请求,确定要执行的控制器和动作;
5)   实例化 CI_Output,这个类提供输出内容的缓存和检查服务;
6)   通过 $OUT->_display_cache($CFG, $RTR) 尝试输出缓存内容,如果成功,则结束程序运行;
7)   判断控制器类定义文件是否存在。如果不存在则通过 show_404() 显示错误信息;
8)   实例化 CI_Input,这个类提供对 $_GET、$_POST 的访问手段,并封装了一些过滤方法;
9)   实例化 CI_URI,这个类提供对 URL 的分析、构造服务;
10)   实例化 CI_Language,这个类提供多语言字符串映射服务;
11)   载入 codeigniter/Base4.php 或者 codeigniter/Base5.php;
12)   载入 libraries/Controller.php;
13)   载入控制器类定义文件;
14)   实例化控制器类;
15)   如果控制器使用了 scaffolding 功能,则调用控制器的 _ci_scaffolding() 方法,否则调用控制器动作方法;
16)   通过 $OUT->_display(); 输出内容($OUT 是 CI_Output 的实例)。


详细

CI_Benchmark
这个类很简单,就是用 microtime() 函数记录时间点,并提供 elapsed_time() 方法来计算两个时间点之间消耗的时间。这个类功能不多,但是很实用。CodeIgniter 中大部分类都是这种设计思想,值得称赞!


CI_Config
这个类其实是在内部维护了一个数组,用来记录应用程序的设置(类似 Windows 注册表)。这种简单的封装可以强制应用程序按照固定的规范访问设置,同时又不将设置保存为全局变量,避免无意中遭到破坏或篡改。

CI_Router
CI_Router 功能很单一。CI_Router 首先分析出应用程序当前使用的 URL 模式:PATHINFO 或普通模式。接下来从 URL 地址中分析出控制器名字、动作名以及参数名和参数值。分析的结果保存为 CI_Router 对象实例的成员变量。这里比较有特点的是,CI_Router 可以根据开发者在应用程序设置里面定义的模式来分析 URL,而不是使用某种固定的模式。

CI_Output
有两个主要功能:获得应用程序执行的所有输出内容和输出缓存服务。

应用程序执行的输出结果都会保存为 CI_Output 的成员变量。然后根据应用程序设置,CI_Output::_display() 方法会调用 CI_Output::_write_cache() 方法将输出内容缓存起来。下一次当使用 CI_Output::_display_cache() 时如果缓存已经建立了,并且没有过期,则会直接输出缓存内容。

在 CI_Output::_write_cache() 中,是根据 URL 地址和 URL 参数来确定缓存 ID 的。因此即便是同一个控制器和动作,只要使用不同的 URL 参数,也会缓存不同的内容。

这个类的功能很简单,因此在许多动态页面是无法使用的。例如用户登录前和登录后,访问同一个控制器和动作并使用相同的 URL 参数,页面内容也有可能是不同的。这时,CI_Output 的缓存就不能使用。因为从本质上来说,CI_Output 提供的缓存是在应用程序之外的,所以应用程序无法根据当前状态来决定是否缓存页面。当一个页面被缓存后,对该页面的访问实际上根本就不会执行应用程序代码,而是由 CI_Output 取出缓存内容直接就输出了。


CI_Input
CI_Input 是类似过滤器,并且提供了对 $_GET、$_POST 的封装服务。例如用 CI_Input::post() 方法来访问 $_POST。由于多了这层封装,CI_Input 可以在 post() 方法中对数据进行更多的过滤。

这种封装从出发点上看,是很不错的。但是这也会造成一些问题。例如 CI_Input 只有在调用 post() 方法时才能进行过滤。如果应用程序使用 $_POST 直接获取数据,那么实际上就绕过了安全屏障。如果应用程序使用了第三方库,那么这种风险更大,因为第三方库很可能会直接使用 $_POST 等全局变量。

因此有些开发者认为过滤应该是全局的,即在框架初始化时,就对所有输入数据进行过滤。但初始化时的全局过滤灵活性很差,要么全过滤,要么都不过滤,没法做到对个别数据的单独过滤。

CI_Input 的另一个问题,就是没有处理 magic_quotes。不管 magic_quotes 设置为什么,CI_Input 都没有对数据进行相关的处理。这样一来,如果服务器的 magic_quotes 设置不同,那么应用程序得到的数据也是不一致的。后来查看数据库驱动的代码,发现 CI_Input 将对 magic_quotes 的处理放到了数据库驱动中。

这种设计是有很大缺陷的!如果应用程序取得数据后,并不是存入数据库(例如直接显示或存入文件),那么就必须自行判断 magic_quotes 的状态。这种判断不但烦琐,而且容易遗忘。所以框架有责任将所有数据库整理为一致的格式,要么是应用 addslashes() 转义过后的数据,要么是没有转义的数据。

奇怪的是 CI_Input 却对输入数据的字段名进行了 magic_quotes 检查,并应用了 addslashes()。这是为了让数据库字段名不会成为 SQL 注入攻击的根源。甚至,CI_Input 还会将 \n\r\n\r 替换为 \n。这种随意篡改原始数据的做法,非常不可取。

总之,我个人认为 CodeIgniter 在这部分的设计是很糟糕的。不过要改善也很简单,几行代码就可以了。然后修改一下数据库驱动。但是由于已经有许多采用 CodeIgniter 开发的应用程序,所以这样的升级改动,影响是非常大的。


CI_URI
由于 CodeIgniter 允许应用程序定义 URL 映射模式,所以需要专门的工具来生成 URL 地址。CI_URI 就是完成这些工作的。
CI_Language
这个类可以载入不同的语言文件。然后应用程序就可以用 CI_Language::line() 方法取出某个项目的对应翻译。每个语言文件就是一个名值对数组。所以 CI_Language::line() 以项目名做为键名,就可以查询到对应的翻译。

分享到:
评论

相关推荐

    PHP敏捷开发CodeIgniter框架

    2. **安装与配置**:安装CodeIgniter非常简单,通常涉及下载框架的ZIP文件,解压到服务器的适当位置,并配置基本的 `.htaccess` 和 `index.php` 文件。开发者可以通过修改配置文件来适应自己的项目需求。 3. **URL...

    php100:CodeIgniter框架教程(3)(第17讲)视频解压密码

    在深入探讨《php100:CodeIgniter框架教程(3)(第17讲)》的相关知识点之前,我们先来了解一下CodeIgniter框架的基本概念及其在PHP开发中的地位。CodeIgniter是一款轻量级、高性能的PHP框架,旨在简化Web应用的开发...

    Codeigniter框架整合Smarty引擎DEMO

    这就是CodeIgniter框架整合Smarty引擎的基本过程。通过这种方式,你可以利用Smarty的强大功能,如模板继承、插件、函数等,来提高代码的可维护性和灵活性。同时,CodeIgniter的MVC架构将使你的项目结构更加清晰,...

    codeigniter框架

    1. **安装**:下载CodeIgniter框架并上传到服务器,配置好基本的服务器环境,如PHP和MySQL。 2. **创建控制器**:创建第一个控制器文件,例如`Welcome.php`,并定义一个或多个方法来处理请求。 3. **建立模型**:...

    PHP100教程2012版:CodeIgniter框架教程(4)(第18讲)解压密码

    通过本节内容的学习,读者应该能够对CodeIgniter框架有一个较为全面的了解,并掌握其基本的使用方法。CodeIgniter不仅适用于小型项目,也能够在大型项目中发挥重要作用。对于想要快速构建Web应用的开发者来说,它是...

    PHP开发框架CodeIgniter中文参考资料

    CodeIgniter是一个轻量级且高效的PHP开发框架,它为开发者提供了一套强大的工具来创建全功能的Web应用。这个框架以其简洁的架构、出色的性能和丰富的文档支持而备受推崇。资源中的三个文件分别提供了不同角度的...

    php100 2012版 17集CodeIgniter框架教程(3)密码

    根据提供的文件信息,本篇文章将围绕“php100 2012版 17集CodeIgniter框架教程(3)密码”这一主题展开详细的知识点解析。 ### CodeIgniter框架简介 CodeIgniter(简称CI)是一款简单、优雅且功能强大的PHP Web...

    PHP 敏捷开发框架 CodeIgniter

    1. 下载最新版本的CodeIgniter框架。 2. 解压到服务器的Web根目录下。 3. 配置 `.htaccess` 文件以隐藏默认的index.php入口文件。 4. 修改 `config/config.php` 文件设置站点基本信息,如base_url等。 5. 创建数据库...

    CodeIgniter 相关文档资料

    2. **codeIgniter框架基本结构分析【中级教程】.docx**: 这份中级教程文档深入探讨了CodeIgniter框架的内部工作原理和架构。它可能包含对框架的核心组件如路由、加载器、URI类、模型-视图-控制器(MVC)模式的详细...

    兄弟连邹义良CodeIgniter框架txt文档

    ### CodeIgniter框架详解 #### 一、CodeIgniter简介 **CodeIgniter**(简称CI)是一款基于PHP语言的轻量级Web...通过本文的介绍,希望能帮助大家更好地理解和掌握CodeIgniter框架的基本用法及其核心组件的使用方法。

    CodeIgniter:php敏捷开发框架web快速开发详解

    这篇文章是有关 CodeIgniter 的(以下简称 CI),CI 是一个达成以上目标的框架。 如果你只是要达成一个最终的结果,而把中间所有的编码细节和复杂统统丢给一个框架,CI 是你最好的朋友。 CI 有很多优点:免费,轻...

    CodeIgniter-CI框架-指南 初学必读

    在提供的`CodeIgniter.chm`文件中,应该包含了以上各个知识点的详细教程和示例,对于初学者来说,是全面了解和掌握CodeIgniter框架的好资料。通过深入学习,开发者可以利用CI框架高效地构建稳定、安全的PHP Web应用...

    codeigniter_clubmilitar:基本商店系统,在Codeigniter框架中制作

    什么是CodeIgniter CodeIgniter是一个应用程序开发框架-一个工具包-适用于使用PHP构建网站的人们。 它的目标是通过提供一组用于执行常见任务的库以及一个简单的界面和逻辑结构来访问这些库,从而使您比从头开始编写...

    辛星Codeigniter教程(2016版)

    首先,我们需要了解Codeigniter框架的基本概念和历史。Codeigniter在汉语中可以翻译为“代码点火器”,它的logo就是一个小火苗,象征着启动项目的强大力量。Codeigniter的历史可以追溯到2006年2月28日,这是它的1.0...

    PHP 敏捷开发框架 CodeIgniter - 快速 Web 应用开发详解

    安装CodeIgniter相当简单,只需下载最新版本的框架,解压到服务器根目录,然后通过修改config.php和database.php文件进行基本配置,包括数据库连接信息等。 三、MVC架构 在CodeIgniter中,模型处理数据逻辑,视图...

    codeigniter 权限系统

    在“codeigniter 权限系统”这个主题中,我们将深入探讨如何在CodeIgniter框架中构建一个完整的权限管理系统。 首先,权限系统的核心是角色-基于权限(RBAC, Role-Based Access Control)模型。在RBAC中,用户被...

    CodeIgniter3.1.3 中文手册

    首先,CodeIgniter框架的一个重要特点是其MVC架构。MVC架构将程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。模型主要负责数据的处理,视图负责展示数据,控制器则用来处理用户的请求。...

    CodeIgniter3.00中文手册pdf

    首先,CodeIgniter框架主要目标是简化PHP开发工作,它提供了大量内置的类库,帮助开发者处理日常任务,并通过简单的接口和逻辑结构,减少代码编写量,提高开发效率。框架定位清晰,旨在为开发者提供一个轻巧、快速、...

    PHP的一个用CodeIgniter做的留言板的例子

    总之,"PHP的一个用CodeIgniter做的留言板的例子"是一个很好的起点,它展示了如何在实践中运用PHP和CodeIgniter框架。通过研究并模仿这个示例,初学者可以深入理解PHP开发,并学会如何构建一个简单的互动式Web应用。

    CodeIgniter 中文手册1.6.3版本

    总之,"CodeIgniter 中文手册1.6.3版本"是学习和掌握CodeIgniter框架的重要参考资料,它涵盖了框架的基本概念、核心组件以及实际开发中的应用技巧。通过深入学习和实践,开发者可以利用CodeIgniter快速构建出高效、...

Global site tag (gtag.js) - Google Analytics