[翻译]CodeIgniter入门 : 一些建议和最佳实践
时间:2010-10-19 来源:Flie
1 使用哪一个版本? 1.7.2 or 2.0
CodeIgniter 2.0 目前虽然还没有最终发布,但它已经非常稳定,并且 EllisLab 公司已经声明不会有很大的变动,只要是修正一些 BUG,许多人认为 2.0 比 1.7.2 更加稳定,Phil Sturgeon 在他的博客中写过一篇非常棒的关于怎样从旧版本升级到 2.0 版本的文章,你可以从 BitBucket.org 下载最新的 CI 2.0 的代码,以及最近的升级。
Moderator Jamie Rumbelow 曾写了一篇关于CI 2.0 的帖子。
2 阅读手册 & 观看视频
了解 CI 的最好的方法是阅读它的手册,里面有很多值得参考的文章,特别是那些高亮的部分,你一定要阅读它们并引起注意。
也可以通过观看 nuttuts+ 上面的视频或 CI网站 上的视频来学习 CI ,后者采用了一个旧的版本,如果你注意了,它仍是一个很好的了解 CI 使用的地方。
3 MVC 编程
如果你还不知道 MVC ,应该尽快的学习,你会很快的体会到在 Model 中数据访问,在 Controller 中进行业务逻辑,在 Views 中编写 HTML 代码的价值。如果你之前没有使用过这种模式写过程序,你也许会皱起额头,不过你应该给自己尝试这样做的机会。
一条实践准则是把更少的东西放进 Controller ,记住 DRY 准则:不要重复造轮子。当在超过一个地方编写相同的代码时,应该根据它的类型来尝试编写一个 library , helper,或 model 。
一旦领悟了 MVC 的精髓,这将会成为一种习惯,你会从 MVC 简洁的代码中受益良多。
4 错误报告 和 调试
常常犯的一个错误是忘记关闭 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);
5 Application 和 System 路径
最好是把 system 和 application 文件夹放在 webroot 以外的地方,如果 index.php 放在 FTP 服务器的 /public_html/ 路径下,应该尝试把 System 放在根目录下 /system ,这样的话,只能通过 index.php 访问你的PHP文件。
不要忘记在index.php文件中修改 $system_folder 和 $application_folder 的值,$system_folder 的值应该是相对于 index.php 文件,而 $application_folder 的值是相对于 system 目录。
6 安全
关于SQL注入,XSS,以及 CSRF ,你应该先了解它们,再决定是否采用方法来防止它们。可以参考CI手册上的安全指南 以及 输入和安全类。也许最重要的原则是在把数据提交到数据库或文件系统之前检查所有用户的输入。
(1) SQL注入
使用 CI 自带的 Active Record 可以解决这个问题。
(2) 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');
(3) CSRF (跨站请求伪造)
CI 2.0 将内置 CSRF 检查,在 Google 上搜索 "CSRF tokens" 学习更多关于在保护表单提交和 URL 链接的知识,在 Ajax 应用方面可以搜索 "double cookie submission" 或 "双提交 cookie"。
(4) SPAM (垃圾留言和恶意注册)
通过保护你的邮件表单,评论表单,以及其他各种免费用户提交的数据来防止垃圾信息,一个简单的方法是只允许一个IP/User客户端在一分钟之内只能提交一次,
最好的方式是使用 Captcha ,比如 reCAPTCHA 来保护邮件表单和评论表单,可以在论坛上搜索怎样在CI中集成 reCAPTCHA 。CI2中内置了一个CAPTCHA的辅助函数。
7 实践
编写简洁的代码,并且理解你的代码,不要只是复制粘贴别人的代码,并且不断提高编码能力。手册上的开发规范是一个能学习怎样更好编写代码的地方。
(1) DRY
不要总是重复造轮子,把能重用的代码放在它应该在的地方,比如libraries, helpers 或者是 models,而不是controllers,一个经验准则:当你复制代码的时候,也许你已经第二次把它放在了错误的地方。
(2) Caching (缓存)
缓存是一个提高性能的很好的方式,尤其是减少数据库的访问。可以参考网页缓存和数据库缓存,或者在论坛上搜索其他的可选方案,比如 MP_Cache 是作者自己的作品。
(3) HTTP headers (HTTP头部)
在客户端你能够通过单独发送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));
8 访问数据库 和 ORM
CodeIgniter 有一个自带的库 Active Record 能够帮助你在不使用 SQL 语句的情况下写查询语句。这在你不太精通 SQL 语句或不知道怎样防止SQL注入的情况下是一个很好的方法。
当你需要更强大的工具时,你可以考虑使用 Object Relational Mapper ,就是鼎鼎大名的 ORM 了,遗憾的是,CodeIgniter 没有自带 ORM 库,不过也有一些其他很好的选择。
最流行的或许是 DataMapper OverZealous Edition (DMZ),还可以使用 Doctrine (这里有一个教程),另一个选择 RapidDataMapper 是作者自己的作品。
9 使用用户验证 和 授权
CodeIgniter没有自带用户验证的库引起很大争论,因为很多用户认为应该包含,也有很多人持反对意见。我的意见是在论坛或 wiki 上搜索一个仍在维护的库,它应该有好的安全性并且能方便的应用到你的程序里。你也可以研究这些例子并且写一个自己的验证库。
这里推荐的一个验证库是 Ion Auth ,它的程序写得很好,也许会比你第一次尝试写的更出色,如果你打算自己写验证库的话,你可以阅读它的代码并获得一些灵感。
10 其他
遇到问题,可以在CodeIgniter的 论坛 和 wiki 上搜索,如果没有解决的话,可以在论坛上提问。