好吧,因為組織需要,最近又開始轉戰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:
<?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' => FALSE,
'cache_on' => FALSE,
'char_set' => 'utf-8',
'dbcollat' => 'utf8_general_ci',
);
$db = DB($params,TRUE);
return $db;
}
?>
創建一個測試文件test.php:
<?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
[email protected]
OK啦~~~ 這樣我們如果要在數據訪問前需要做權限校驗的話,只需要在MYDB函數中做判斷即可。
另外,不得不說ci模塊拆分的確實不錯,instantiate_class是來自於它的system\codeigniter\Common.php。 log_message我給重寫了一下,因為對於每個調用者來說,希望寫log的方式是不一樣的。(比如我這次就直接打印在了屏幕上。。。。),最近正好 在看設計模式,這種方式也是符合模版方法模式的。
作者“wolf的個人空間”