抽离CodeIgniter的数据库访问类!
好吧,因为组织需要,最近又开始转战php了,业务逻辑都还好说,主要是老大要求在数据访问层上加上登录态验证。
其实这种要求也是合理的,互联网服务要求上层保护下层,但下层不能完全相信上层。但是问题也就来了,有如下两种方案:
1.写一个mysql proxy server,用来将调用方发来的请求拼装,然后返回给调用侧。这样做的主要难度在于:
- a)SQL语句的拼装及序列化
- b)数据集序列化,虽然有不少这方面的产品,但是终究还是太过复杂,而且没有时间折腾
果断放弃。
2.封装一层mysql的api,调用方直接在本地调用即可。这样的话,只需要考虑SQL语句的拼装即可。现在就有很多选择啦,
- a)使用类似django里面Model的模型类
- b)使用ci中的Active Record
虽然说Model的方式,对数据层的屏蔽较好,但是小组成员普遍认为这种方式过重,轻量的一点的话,最终还是选择了CodeIgniter中的AR。
OK,那么现在,考验ci模块拆分的好不好的时候到啦!
具体中间的种种辛苦就不说啦,直说我最终的实现把,拷贝system\database到一个单独的目录,x:/php/ 。
创建一个文件myconfig.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<?php define('BASEPATH', dirname(__FILE__).'/'); define('EXT', '.php'); require_once(BASEPATH . 'database/DB' . EXT); function &instantiate_class(&$class_object) { return $class_object; } function log_message($level = 'error', $message, $php_error = FALSE) { echo($message); } function MYDB() { $params = array( 'dbdriver' => 'mysql', 'hostname' => 'localhost', 'username' => 'root', 'password' => '', 'database' => 'dante', 'pconnect' => TRUE, 'db_debug' => TRUE, 'cache_on' => FALSE, 'char_set' => 'utf-8', 'dbcollat' => 'utf8_general_ci', ); $db = DB($params,TRUE); return $db; } ?> |
创建一个测试文件test.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php require_once('myconfig.php'); $db = MYDB(); $db->select('ID,user_login,user_email'); $query = $db->get('wp_users'); echo "\n"; foreach ($query->result() as $row) { print $row->ID . "\n"; print $row->user_login . "\n"; print $row->user_email . "\n"; } ?> |
输入结果如下:
Database Driver Class Initialized 1 admin zny2008@gmail.com
OK啦~~~ 这样我们如果要在数据访问前需要做权限校验的话,只需要在MYDB函数中做判断即可。
另外,不得不说ci模块拆分的确实不错,instantiate_class是来自于它的system\codeigniter\Common.php。log_message我给重写了一下,因为对于每个调用者来说,希望写log的方式是不一样的。(比如我这次就直接打印在了屏幕上。。。。),最近正好在看设计模式,这种方式也是符合模版方法模式的。
ps:
《php敏捷开发框架CodeIgniter - 快速web应用开发详解》这本书中关于ar的用法中的例子居然是错的,害得我看源码才发现问题,书中的例子是这样的:
1 |
$this->db->select('url','name','clientid','people.surname AS client'); |
而实际应该是这样的:
1 |
$this->db->select('url,name,clientid,people.surname AS client'); |
代码下载(以后代码都会像这样,统一放到google code上下载):
http://vimercode.googlecode.com/svn/trunk/ci_model/
建议继续学习:
- mysql-proxy中Admin Plugin的使用以及读写分离的问题 (阅读:7561)
- socks5 proxy 折腾记 (阅读:5728)
- Codeigniter ACL library (阅读:5311)
- Codeigniter里的无刷新上传 (阅读:4602)
- 在centos 5.2下安装最新的mysql proxy (阅读:2939)
- 关于mysql proxy 0.7.0 (阅读:2707)
- OpenStack Swift源码导读之——业务整体架构和Proxy进程 (阅读:2767)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:Dante 来源: Vimer
- 标签: CodeIgniter proxy
- 发布时间:2010-11-15 22:21:39
- [56] Oracle MTS模式下 进程地址与会话信
- [56] IOS安全–浅谈关于IOS加固的几种方法
- [55] 如何拿下简短的域名
- [54] 图书馆的世界纪录
- [53] Go Reflect 性能
- [53] android 开发入门
- [50] 【社会化设计】自我(self)部分――欢迎区
- [50] 读书笔记-壹百度:百度十年千倍的29条法则
- [39] 程序员技术练级攻略
- [33] 视觉调整-设计师 vs. 逻辑