PHP實現簡單MVC構想

   對於現在的應用程序來說,從基礎的寫起的時代已經遠去了,更多的是從架構,可擴展性以及可維護性上來考慮了。因此也產生了很多的框架,尤其在開源世界算的 上是百花齊放的景象。各種各樣的模式和架構到處都是,對於現在的web開發來說,mvc(Model-View-Controller)還是很常用使用的 一個模式。很多框架都是圍繞這一模式,比如java的struts,還有spring也提供自己的mvc。這裏不介紹java的,只是用PHP實現一些簡 單mvc的構想,想法來自於zend framework(出自於官方php開發團隊),有興趣的朋友可以去 http://framework.zend.com/ 看看。

  大概的想法如下,把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等等,都是很不錯的框架,都可以用來參考。 
發佈了22 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章