IT技术博客大学习 共学习 共进步

抽离CodeIgniter的数据库访问类!

Vimer 2010-11-15 22:21:39 浏览 3,162 次

好吧,因为组织需要,最近又开始转战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/

建议继续学习

  1. mysql-proxy中Admin Plugin的使用以及读写分离的问题 (阅读 8,622)
  2. socks5 proxy 折腾记 (阅读 6,781)
  3. Codeigniter ACL library (阅读 5,920)
  4. Codeigniter里的无刷新上传 (阅读 5,421)
  5. OpenStack Swift源码导读之——业务整体架构和Proxy进程 (阅读 4,421)
  6. 在centos 5.2下安装最新的mysql proxy (阅读 3,800)
  7. 关于mysql proxy 0.7.0 (阅读 3,522)