点击查看原文章

好吧,因为组织需要,最近又开始转战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. <?php 
  2. define('BASEPATH', dirname(__FILE__).'/'); 
  3. define('EXT''.php'); 
  4. require_once(BASEPATH . 'database/DB' . EXT); 
  5.   
  6. function &instantiate_class(&$class_object
  7.     return $class_object
  8.   
  9. function log_message($level = 'error'$message$php_error = FALSE) 
  10.     echo($message); 
  11. function MYDB() 
  12.     $params = array
  13.         'dbdriver'  => 'mysql'
  14.         'hostname'  => 'localhost'
  15.         'username'  => 'root'
  16.         'password'  => ''
  17.         'database'  => 'dante'
  18.         'pconnect'  => TRUE, 
  19.         'db_debug'  => FALSE, 
  20.         'cache_on'  => FALSE, 
  21.         'char_set'  => 'utf-8'
  22.         'dbcollat'  => 'utf8_general_ci'
  23.     ); 
  24.     $db = DB($params,TRUE);     
  25.     return $db
  26. ?> 

创建一个测试文件test.php:

 

  1. <?php 
  2. require_once('myconfig.php'); 
  3. $db = MYDB(); 
  4. $db->select('ID,user_login,user_email'); 
  5. $query = $db->get('wp_users'); 
  6. echo "\n"
  7. foreach ($query->result() as $row
  8.     print $row->ID . "\n"
  9.     print $row->user_login . "\n"
  10.     print $row->user_email . "\n"
  11. ?> 

输入结果如下:


  1. Database Driver Class Initialized 
  2. admin 
  3. zny2008@gmail.com 

OK啦~~~ 这样我们如果要在数据访问前需要做权限校验的话,只需要在MYDB函数中做判断即可。
另外,不得不说ci模块拆分的确实不错,instantiate_class是来自于它的system\codeigniter\Common.php。 log_message我给重写了一下,因为对于每个调用者来说,希望写log的方式是不一样的。(比如我这次就直接打印在了屏幕上。。。。),最近正好 在看设计模式,这种方式也是符合模版方法模式的。