总结Codeigniter的一些优秀特性

近期准备接手改进一个别人用Codeigniter写的项目。尽管之前也实用过CI,可是是全然按着自己的意思写的,没按CI的一些套路。用在公众的项目,不妨按框架规范来。所以还是总结一下,免得以后别人再接手的时候贻笑慷慨。



1. 首先是 MVC



假设你还不知道 MVC 。应该尽快的学习,你会非常快的体会到在 Model 中数据訪问,在 Controller 中进行业务逻辑。在 Views 中编写 HTML 代码的价值。假设你之前没有使用过这样的模式写过程序,你或许会皱起额头,只是你应该给自己尝试这样做的机会。



一条实践准则是把更少的东西放进 Controller ,记住 DRY 准则:不要反复造轮子。当在超过一个地方编写同样的代码时。应该依据它的类型来尝试编写一个 library。 helper。或 model。比方数据库连接类。用得非常频繁。就把它做成 model(系统已提供)。

一旦领悟了 MVC 的精髓。这将会成为一种习惯,你会从 MVC 简洁的代码中受益良多。



一个原则就是:复杂的操作都交给Model。Controller更像个建筑师。 Model是苦工。

View 是粉刷工。Controller 仅仅须要把东西丢进Model里就能够了。不须要在意数据是否异常,然后返回一个标志位以及对应的数据。

这样MVC 的 架构就体现出来了。



Model事实上就像一个电器如:微波炉一样,用法越简单越让人喜欢,(把食物放进去 -按启动 -ok,饭熟了。

)接口少的优点是,Model升级代码优化的时候,对外界的耦合度不高。即使你内部写得非常烂。接口也非常干净。用起来也简单。

2. Application 和 System 路径



最好是把 system 和 application 文件夹放在 webroot 以外的地方。假设 index.php 放在 FTP server的 /public_html/ 路径下,应该尝试把 System 放在根文件夹下 /system ,这种话,仅仅能通过 index.php 訪问你的PHP文件。

不要忘记在index.php文件里改动 $system_folder 和 $application_folder 的值。$system_folder 的值应该是相对于 index.php 文件。而 $application_folder 的值是相对于 system 文件夹。

3. 错误报告和调试



经常犯的一个错误是忘记关闭 PHP 错误和数据库错误报告,这样做是有风险的。

在不论什么一个公开的网站,error_reporting 应该设置为0 ,最多仅仅能设置为 E_ERROR,数据库设置 db_debug 应该设置为 false,基于其它安全考虑,设置不显示出错信息 ini_set('display_errors', 'Off');



在你编码和调试时。应该把 error_reporting 设置为 E_ALL ,而且在把应用程序公布前解决每个注意和警告。



一种简易的方法是在 application/config/database.php 文件设置 db_debug 的值为一个常量 MP_DB_DEBUG,当站点在执行中,例如以下设置:

ini_set('display_errors', 'Off');

error_reporting(0);

define('MP_DB_DEBUG', false);

在编码和调试中设置为:

ini_set('display_errors', 'On');

error_reporting(E_ALL);

define('MP_DB_DEBUG', true);

4. 安全问题非常重要



在接收不论什么数据到你的程序之前,无论是表单提交的 POST 数据、COOKIE 数据、URI 数据、XML-RPC 数据、还是 SERVER 数组中的数据,我们都推荐你实践以下的三个步骤:



过滤不良数据.



验证数据以确保符合正确的类型, 长度, 大小等. (有时这一步骤也可代替第一步骤)



在提交数据到你的数据库之前将其转换.



关于SQL注入,XSS。以及 CSRF ,你应该先了解它们。再决定是否採用方法来防止它们。能够參考CI手冊上的安全指南 以及 输入和安全类。

或许最重要的原则是在把数据提交到数据库或文件系统之前检查全部用户的输入。

SQL注入。使用 CI 自带的 Active Record 能够解决问题。



XSS (跨站脚本)。通过设置 $config['global_xss_filtering'] = TRUE; 开启自己主动过滤POST和COOKIE中的跨站脚本攻击,但须要消耗一些资源。也能够在每次处理POST和COOKIE的时候单独使用,把第二个參数设为TRUE。如 $this->input->post('some_data', TRUE); 表单验证类也提供了 XSS 过滤选项,如 $this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean');



CSRF (跨站请求伪造)。

CI 2.0 将内置 CSRF 检查,在 Google 上搜索 "CSRF tokens" 学习很多其它关于在保护表单提交和 URL 链接的知识,在 Ajax 应用方面能够搜索 "double cookie submission" 或 "双提交 cookie"。



SPAM (垃圾留言和恶意注冊)。通过保护你的邮件表单,评论表单,以及其它各种免费用户提交的数据来防止垃圾信息,一个简单的方法是仅仅同意一个IP/Userclient在一分钟之内仅仅能提交一次,一个比較好的方式是使用 Captcha ,CI2中内置了一个CAPTCHA的辅助函数。

5. 数据库 和 ORM



CodeIgniter 有一个自带的库 Active Record 可以帮助你在不使用 SQL 语句的情况下写查询语句。这在你不太精通 SQL 语句或不知道如何防止SQL注入的情况下是一个非常好的方法。



当你须要更强大的工具时,你能够考虑使用 Object Relational Mapper ,就是鼎鼎大名的 ORM 了,遗憾的是,CodeIgniter 没有自带 ORM 库,只是也有一些其它非常好的选择。



最流行的也许是 DataMapper OverZealous Edition (DMZ),还能够使用 Doctrine (这里有一个教程),还有一个选择 RapidDataMapper 是作者自己的作品。



6. 代码实践



编写简洁的代码。而且理解你的代码,不要仅仅是复制粘贴别人的代码,而且不断提高编码能力。手冊上的开发规范是一个能学习如何更好编写代码的地方。



1. DRY。不要总是反复造轮子,把能重用的代码放在它应该在的地方,比方libraries, helpers 或者是 models。而不是controllers。一个经验准则:当你复制代码的时候,或许你已经第二次把它放在了错误的地方。



2. Caching (缓存)。

缓存是一个提高性能的非常好的方式,尤其是降低数据库的訪问。

能够參考网页缓存和数据库缓存,或者在论坛上搜索其它的可选方案,比方 MP_Cache 是作者自己的作品。



3. HTTP headers (HTTP头部)。在client你可以通过单独发送HTTP头部使浏览器缓存页面来提高性能,当你使用 AJAX 的时候你也须要了解它来禁止浏览器缓存。

一个禁止缓存的样例:

$this->output->set_header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

$this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate");

$this->output->set_header("Cache-Control: post-check=0, pre-check=0", false);

$this->output->set_header("Pragma: no-cache");

一个长时间保持缓存的样例(比方 css, javascript):

$this->output->set_header('Cache-Control: private, pre-check=0, post-check=0, max-age=2592000');

$this->output->set_header('Expires: ' . gmstrftime("%a, %d %b %Y %H:%M:%S GMT", time() + 2592000));

$this->output->set_header('Last-Modified: ' . gmstrftime("%a, %d %b %Y %H:%M:%S GMT", time() - 20));

7. 模板渲染不必每次都调用 header 与 footer



在 MY_Controller 头部和 __construct 函数中加入下面内容。用于设定默认的模版信息,当中 SITE_NAME 须要自己在 application/config/constants.php 里面自定义:

class MY_Controller extends CI_Controller {

  protected $_data;    // 模版传值数组

  protected $_tplext;  // 默认模版后缀

  protected $_header;  // 默认头部模版

  protected $_footer;  // 默认底部模版

  public function __construct () {

      parent::__construct();

      $this->_data['title'] = SITE_NAME;

      $this->_tplext = '.php';

      $this->_header = 'templates/header';

      $this->_footer = 'templates/footer';

      // 开发模式下开启性能分析

      if (ENVIRONMENT === 'development') {

          $this->output->enable_profiler(TRUE);

      }

  }

}

8. 不必全部的类都继承 CI_Controller



新增的控制器不再继承 CI_Controller,而改继承 MY_Controller:

class Index extends MY_Controller {

  public function __construct () {

      parent::__construct();

  }

  /**

   * 前台首页

   */

  public function index () {

      $this->_data['title'] = '首页';  // 不指定则使用默认标题 SITE_NAME

      $this->_view('index/index');

  }

}

末了,再补充两个:

9. CodeIgniter的文件结构



cache用以存储缓存文件。codeigniter目录包括了CI的基类CI_Base,为了兼容php4和php5,CI_Base有两个版本号,当中php4版本号的CI_Base继承于CI_Loader。libraries里存放了大部分经常使用的类库。最基本的三个类:Model,View和Cotronller。自己写的不论什么mvc都要继承于已有的mvc类;helpers里是一些函数(方法)集合,用以辅助其它模块的方便工作。language是一个语言包。用以支持多语言。

application目录用以存储您的应用程序,CI已经在内部为您增加了一些子文件,包含models、views、controllers、config、errors、hooks和libraries。

当中前三个目录是用以创建模型、视图和控制器的。

您的大部分工作都应该是创建属于自己的MVC。并可在config里增加配置文件,libraries里增加一些对象和方法,用来辅助您的模型和控制器工作。而hooks也是对CI_Hooks的扩展,详细内容见以下的章节。



10. CodeIgniter的工作过程



当有一个http请求时,如http://www.google.com/blog/。首先进入CI的引导文件index.php。

接下来我们看看index.php里做了哪些事情。



index首先设置了应用程序的目录名称为application。系统的目录名称为system,然后做了一系列严格的推断并转换为unix风格的server绝对文件路径,详细说来定义了两个比較重要的常量,APPPATH。应用程序的目录路径。依据分析可知,该路径能够和system同级:htdocs/application/,也能够放到system目录里面,作为其子目录:htdocs/system/application/,但推荐採用另外一种方式,这样显得比較整齐;BASEPATH,站点文档的基本文件路径。写出来大概是htdoc/system/。到最后。index引导文件引入了codeigniter/codeigniter.php里。

接下来我们看看codeigniter里做了什么事情。



codeigniter.php一上来就引入了三个文件:Common.php,Compat.php和config/constants.php,当中Common里包括了一些函数。用于加载类库的load_class,记录日志的log_message,和引入错误页面的show_404是几个重要的函数;Compat主要攻克了php4和php5中的函数不兼容问题,而constants则定义了一些读写文件权限的常量。



紧接着codeigniter加载了第一个类库。Benchmark,这个类库最简单的一个应用就是计算网页从開始到编译结束所花掉的时间,所以您在编译開始的地方打上一个标记,渲染结束后再打上一个标记。就能够算出当中花费的时间了。



接着加载了第二个类库。Hooks,这个类库和Benchmark一样都是在system\libraries下,这个类库的作用是在程序開始编译之前给您提供一个运行其它事情的机会,Hooks会您运行其它任务提供了大约8个机会。详细參见用户指南。

在这里。它导入了第一个钩子。



然后分别加载了Config,URI,Router,Output等类库。接着,检查是否有cache_override的钩子,这个钩子能够同意您调度自己的函数来替代Output类的_display_cache方法。假设没有。直接调用Output的_display_cache,检查是否有缓存内容。假设有,则直接输出缓存。退出。假设没有。则接着往下运行。



此后,继续加载Input,Language,注意此前加载的类库都是一个引用;然后又一个重要的加载,那就是CI_Base对象的加载,首先会推断php的版本号。假设是php4版本号的,则会首先加载Loader。然后加载Base4。由于Base4中CI_Base继承于CI_Loader,而Base5中,CI_Base与CI_Loader没有继承关系。

下一步。也是真正关键的一步了,这一步開始加载了一个Controller类,这个是个实例,而不是引用;然后通过Router来解析http地址,获得控制器和方法的名字,接着看application\controllers里是否存在这种控制器和方法,假设没有,则报错;假设有,则開始推断。



小结



先总结这么多。以后有再补充。

希望大家能投喜欢。

參考来源: 

Codeigniter的几个优秀特性

http://www.lai18.com/content/368835.html

延伸阅读

《PHP框架CodeIgniter》系列技术文章整理收藏

1CodeIgniter php mvc框架 中国站点

2怎样去掉CodeIgniter URL中的index.php

3php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题

4使用CodeIgniter的类库做图片上传

5CodeIgniter的缓存机制与用法

6怎样调整CodeIgniter的报错级别

7扩展Codeigniter的用户登录验证

8给CodeIgniter加上phpcms的模板机制

9CodeIgniter框架基本配置文件config.php介绍

10用原生PHP写一个像CodeIgniter的路由功能

11在CodeIgniter中集成百度编辑器UEditor

12apache+codeigniter 通过.htcaccess做动态二级域名解析

13CodeIgniter自带的数据库类使用介绍

14解析CI即CodeIgniter框架在Nginx下的重写规则

15php之CodeIgniter学习笔记

16CodeIgniter图像处理类的深入解析

17解析CodeIgniter自己定义配置文件

18解析php框架codeigniter中怎样使用框架的session

19解析怎样去掉CodeIgniter URL中的index.php

20CodeIgniter上传图片成功的所有过程分享

21PHP开源框架CodeIgniter公布2.1.1版

22php codeigniter框架分页类

23CodeIgniter基本配置具体介绍

24CodeIgniter使用phpcms模板引擎

25CodeIgniter生成站点sitemap地图的方法

26Codeigniter轻松整合smarty

27让Codeigniter支持HMVC架构

28让Codeigniter实现Layout功能

29codeigniter使用技巧批量插入数据实例方法分享

30codeigniter框架批量插入数据

31codeigniter教程之多文件上传使用演示样例

32codeigniter教程之上传视频并使用ffmpeg转flv演示样例

33解决Codeigniter不能上传rar和zip压缩包问题

34CodeIgniter框架中_remap()用法2例

35codeigniter自带数据库类用法说明

36Codeigniter同一时候获取分页数据和总条数

37Codeigniter在CLI下运行占用内存过大问题,CI又一大坑

38codeigniter中測试通过的分页类演示样例

39CodeIgniter框架提示Disallowed Key Characters的解决的方法

40codeigniter框架The URI you submitted has disallowed characters错误解决方法

41关于CodeIgniter你可能不知道的5个知识点

42解决CodeIgniter伪静态失效

43CI(CodeIgniter)框架介绍

44CI(CodeIgniter)框架中的增删改查操作

45CI(CodeIgniter)框架配置

46CodeIgniter启用缓存和清除缓存的方法

47让CodeIgniter数据库缓存自己主动过期的处理的方法

48Codeigniter实现智能裁剪图片的方法

49Codeigniter实现处理用户登录验证后的URL跳转

50新浪SAE云平台下使用codeigniter的数据库配置

51Codeigniter整合Tank Auth权限类库具体解释

52让codeigniter与swfupload整合的最佳解决方式

53Codeigniter实现多文件上传并创建多个缩略图

54Codeigniter上传图片出现“You did not select a file to upload”错误解决的方法

55CodeIgniter框架过滤HTML危急代码

56让CodeIgniter的ellipsize()支持中文截断的方法

57Codeigniter生成Excel文档的简单方法

58codeigniter集成ucenter1.6双向通信的解决的方法

59CodeIgniter输出中文乱码的两种解决的方法

60Codeigniter中禁止A Database Error Occurred错误提示的方法

61Codeigniter+PHPExcel实现导出数据到Excel文件

62使用CodeIgniter的类库做图片上传

63使用配置类定义Codeigniter全局变量

64Codeigniter出现错误提示Error with CACHE directory的解决方式

65codeigniter数据库操作函数汇总

66Codeigniter注冊登录代码演示样例

67Codeigniter操作数据库表的优化写法总结

68CodeIgniter CLI模式简单介绍

69CodeIgniter安全相关设置汇总

70CodeIgniter实现更改view目录路径的方法

71CodeIgniter模板引擎使用实例

72CodeIgniter中使用cookie的三种方式具体解释

73CodeIgniter採用config控制的多语言实现依据浏览器语言自己主动转换功能

74完好CodeIgniter在IDE中代码提示功能的方法

75CodeIgniter中实现泛域名解析

76codeigniter上传图片不能正确识别图片类型问题解决方法

772个Codeigniter文件批量上传控制器写法样例

78Codeigniter中mkdir创建文件夹遇到权限问题和解决方法

79CodeIgniter框架数据库事务处理的设计缺陷和解决方式

80Codeigniter框架的更新事务(transaction)BUG及解决方法

81CodeIgniter框架URL路由总结

82CodeIgniter错误mysql_connect(): No such file or directory解决方法

83Codeigniter的一些优秀实践

84Codeigniter(CI)框架分页函数及相关知识

85Codeigniter购物车类不能加入中文的解决方法

86Codeigniter框架实现获取分页数据和总条数的方法

87Codeigniter的一些优秀特性总结

88PHP 框架 Codeigniter 的一些优秀实践

89CodeIgniter针对lighttpdserverURL重写的方法

90CodeIgniter使用smtp服务发送html邮件的方法

91CodeIgniter实现从站点抓取图片并自己主动下载到目录里的方法

总结Codeigniter的一些优秀特性的更多相关文章

  1. C++的优秀特性6:智能指针

    (转载请注明原创于潘多拉盒子) 智能指针(Smart Pointer)是C++非常重要的特性.考虑如下一段使用简单指针(Plain Pointer)的代码: A* a = new A(); B* b ...

  2. C++的优秀特性1:引用

    (转载请注明原创于潘多拉盒子) 一本典型的C语言教科书的厚度大约是200页左右,而一本典型的C++教科书的厚度至少要500页.比如K&R的<The C Programming Langu ...

  3. C++的优秀特性4:指针

    (转载请注明原创于潘多拉盒子) 其实指针不是C++的特性,而是地地道道的C的特性.有人说C++继承了C的指针,实在是败笔,造成内存泄漏云云,纯粹是不懂.可以这么说,如果没有指针,C++会逊色很多,应用 ...

  4. C++的优秀特性3:构造函数和析构函数

    (转载请注明原创于潘多拉盒子) 构造函数和析构函数是C++中再熟悉不过的概念了,几乎每个了解一点C++的人都知道这两个概念是什么意思.一个对象的全部生命期中构造函数和析构函数执行的时机如下: 1. 为 ...

  5. C++的优秀特性2:inline 函数

    (转载请注明原创于潘多拉盒子) Inline函数是C++的一个很小的特性,在不计较效率的情况下,这个特性似乎可有可无.然而,C++天生是为最为广泛的应用场景设计的,因此,总会有关于效率的问题.其实,除 ...

  6. Codeigniter的一些优秀实践

    最近准备接手改进一个别人用Codeigniter写的项目,虽然之前也有用过CI,但是是完全按着自己的意思写的,没按CI的一些套路.用在公众的项目,最好还是按框架规范来,所以还是总结一下,免得以后别人再 ...

  7. C++的优秀特性5:模版

    (转载请注明原创于潘多拉盒子) C++是强类型语言,而且恐怕是强类型语言里面类型最严格的.这意味着:1. C++变量的类型在定义时就确定了:2. 该类型在后续的生命期中不会改变.比如: int n = ...

  8. Swiftl优秀的特性

    Swift语言在吸收诸多优秀语言如java.c++,Python之后.提供给开发人员大量优秀的特性. 以下我列举一下,swift一些优秀的特性: 1.函数使用经典的圆括号和点调用语法 2.函数标签特性 ...

  9. 关于js当中一些糟糕的特性

    首先,不可否认,js是一门具有许多优秀特性的弱类型语言,但是这门语言在设计之初就投入了工程实践,没有经历严格的实验室测试,以致力于它是如此的粗糙,在相当长的一段时间很不受开发者待见,被视为一门玩具性的 ...

随机推荐

  1. 按示例学python:使用python抓取网页正文

    平时打开一个网页,除了文章的正文内容,通常会有一大堆的导航,广告和其他方面的信息.本博客的目的,在于说明如何从一个网页中提取出文章的正文内容,而过渡掉其他无关的的信息. 这里先看看 demo : ht ...

  2. Squid普通代理&&透明代理&&反向代理学习

    普通代理                                                              背景                                 ...

  3. 在Linux上安装Chef工作站

    导读 Chef是一个IT基础设施自动化软件,它可以管理你组织中所有的服务器和网络设备.当我们想与Chef服务器.任何物理节点(服务器.网络设备等)的基础设施进行交互时,我们需要一个Chef工作站.本教 ...

  4. 如何用命令行管理windows记住的用户名和密码

    cmdkey https://technet.microsoft.com/en-us/library/cc754243.aspx

  5. [Functional Programming] mapReduce over Async operations with first success prediction (fromNode, alt, mapReduce, maybeToAsync)

    Let's say we are going to read some files, return the first file which pass the prediction method, t ...

  6. [Node.js]29. Level 6: Socket.io: Setting up Socket.io server-side & Client socket.io setup

    Below we've already created an express server, but we want to start building a real-time Q&A mod ...

  7. 一段遍历4X4表格,取出每个单元格内容组合成文本的JS代码

    遍历表格的JS容易忘,留个随笔以备忘. var tableData="";    var table=document.getElementById("XXTableId ...

  8. CheeseZH: Stanford University: Machine Learning Ex2:Logistic Regression

    1. Sigmoid Function In Logisttic Regression, the hypothesis is defined as: where function g is the s ...

  9. VS2010中生成遇到的 web.config 问题

    1. 错误:无法在此路径使用此配置节.当站点管理员使用继承的配置文件中的  <location allowOverride="false">  锁定对此节的访问时会出现 ...

  10. [每日一题] OCP1z0-047 :2013-08-24 FLASHBACK—TABLE/PRIMARY KEY(FOREIGN KEY?)......98

    正确答案:D 根据题意如下操作: 一.创建表dept gyj@OCM> CREATE TABLE DEPT 2 (DEPTNO NUMBER(2,0), 3 DNAME VARCHAR2(14) ...