大概的想法如下,把url請求映射到某個類的某個方法上去,比如http://localhost/book/view/,對應到 BookController的viewAction方法。首先要在工程目錄下建.htaccess,裏面實現url重定向,這裏需要url- rewrite模塊,沒有的話就需要自行編譯下。
RewriteEngine on # 開啓rewrite
RewriteRule !/.(js|ico|gif|jpg|png|css)$ index.php # 把不是這些url請求重定向到index.php
在index.php 裏可以通過$_SERVER['REQUEST_URI']來獲取url請求,可以通過分割/字符來獲取所有細節。如果沒有rewrite模塊這裏也可以 通過分割$_SERVER['PATH_INFO']來實現,上面的url也換成http: //localhost/index.php/book/view/。部分代碼可以參考如下:
// 通過正則來分割字符,並返回沒有空字符的數組。可以用print_r來打印下具體結果。
$uri = preg_split("////", $_SERVER['REQUEST_URI'], -1, PREG_SPLIT_NO_EMPTY);
$controller = $uri[1];
$action = $uri[2];
if(!isset($controller)){
$controller = "Index";// 如果沒有controller參數可以定向到默認的Index
}
$controller .="Controller";
if(class_exists($controller)){ // 判斷該$controller類是否存在
if(!isset($action)){ // 如果沒有action參數可以定向到默認的indexAction
$action="index";
}
$action.="Action";
if(method_exists($controller, $action)){ // 判斷該類是否有action方法
$a = new $controller; // 初始化controller類
$a->$action(); // 調用action
}else{
echo "/$controller/$action 該方法不存在 ";
}
}else{
echo "/$controller 頁面不存在 ";
}
這些只是簡單的分割以及判斷的程序片段,下面可以做一些簡單的測試代碼:
class IndexController{
function indexAction(){
echo get_class($this)."首頁";
}
}
class BookController{
function indexAction(){
echo get_class($this)."----------index action----------<br>";
}
function viewAction(){
echo get_class($this)."----------view action----------<br>";
}
}
上面的這些可以把url請求過來的字符可以映射到某個類和方法上去,算起來應該是個比較簡單的controll了。代碼只是片段,還有很多需要完善的部分,比如對於到文件當中的類,項目總不能把所有的類和方法都寫到一個文件裏把。
實現了簡單的controll,下面就來說說view部分,這裏沒有什麼考慮的,直接採用現有的資源,手頭的選擇有兩種:PHPLib Template和Smarty,當然還有個FastTemplate。PHPLib Template比較簡單,在lib裏面只有一個template.inc,在項目中引用即可,很簡單好用,速度也很快,當然簡單也有不好的地方,比如功 能比較單一,只是簡單的變量替換等等,Smarty是php官方推薦的,最大的有點就是提供了緩存,可以在頁面請求的時候判斷下是否有緩存文件,這樣速度 會有大幅度的提升。下面是兩種模板的一些示例代碼:
PHPLib Template:
require_once('template.inc');
$tpl=new Template("."); // 初始化模板方法,.表示在模板文件夾是當前目錄
$tpl->set_file("result","test.tpl"); // 把test.tpl 轉到 result句柄上
$tpl->set_var("name","smallfish"); // 給變量name賦值
$tpl->parse("out","result"); // 把句柄result轉到out變量
$tpl->p("out");// 輸出
對應的test.tpl:hello,{name}!
Smarty:
define('SMARTY_DIR','./Smarty/'); // 定義SMARTY_DIR Lib目錄
require_once(SMARTY_DIR.'Smarty.class.php');
$smarty = new Smarty; // 初始化類
$smarty ->template_dir = './templates/'; // 這些是制定的目錄,默認也是這些目錄
$smarty ->compile_dir = './templates_c/';
$smarty ->config_dir = './configs/';
$smarty ->cache_dir = './cache/';
$smarty ->assign('name', 'smallfish'); // 變量處理
$smarty ->display('test.tpl'); // 輸出
對應的test.tpl:hello,{$name}!
具體詳細的使用可以參見各種的參考手冊。
而Model部分,最簡單的就是使用封裝一套數據庫的類庫,實現數據庫的查詢以及更新等操作。PHPLib自帶的db_mysql.inc很不錯,有點類 似於java的設計。有的時候Model邏輯部分都寫在Action裏面了,不過最好還是分開,在Model裏面實現具體的增刪改查等操作,並返回數組或 者對象給Action,這樣結構很清晰,也是mvc設計的初衷。現在很多Model都採用ORM的方法,實現了數據庫表對應到Object的操作,雖然這 裏不是懷疑各種ORM的效率以及其他,很多時候還是覺得直接用sql來的直接,而且效率也高,而把Model詳細到當個文件當中,相信維護起來也並不是很 困難。
以上的這些只是個人一些構想,要寫一個框架還需要很多的地方要去完善。PHP做爲快速開發的代表語言,各種架構框架也多如牛毛,官方的zend framework,其他的如cakephp等等,都是很不錯的框架,都可以用來參考。