PHP簡單實現MVC框架路由功能模式
說到使用PHP進行網站開發,自然離不開各種PHP的開發框架,開發框架為我們提供了靈活的開發方式,MVC層分離,業務解耦等等,讓我們的開發更為快捷方便。但是很多人只是會使用框架,卻從來不去了解框架的內部是如何實現的,這對於我們程式設計能力的提高是沒有一點用處的。那麼這一篇博文,我們就先來一個簡單點的功能,也就是說說MVC框架的路由功能實現方法。
一般的單入口框架路由都是這樣的結構:localhost/MVC/index.php/classname/functionname/var1/var2。這裡的index.php通常被我們稱為入口檔案。對於伺服器而言,你這裡訪問的就只有index.php 後面呼叫的controller 和裡面的方法,甚至傳值都是在框架內部基於PHP層面實現的。下面我們就來簡單的實現MVC框架路由功能。
1、首先,建立好MVC檔案結構
下面我們就來動手試試,怎麼才能訪問到controllers裡面的檔案。
在index.php裡面輸入以下內容:
<?php /** * MVC路由功能簡單實現 * @desc 簡單實現MVC路由功能 * $Author: Zhihua_W */ //打印出所有的伺服器變數 print_r($_SERVER); ?>
然後輸入訪問地址試試。這裡我是用本地環境的,我訪問的地址是:localhost/MVC/index.php/class/function/var1。下面我貼出兩個最重要的變數:
[REQUEST_URI] => /MVC/index.php/class/function/var1 [SCRIPT_NAME] => /MVC/index.php
其實路由最基本的原理就在這裡,通過這2個變數來提取url地址裡的class名稱和 function名稱,引數等,然後把class include進來,通過PHP的回撥函式 call_user_func_array 呼叫對應的function和傳遞相應的引數。接下來就是各個檔案的具體程式碼了,讀程式碼應該比我寫的易懂。
2、index.php檔案內容
<?php /** * MVC路由功能簡單實現 * @desc 簡單實現MVC路由功能 * $Author: Zhihua_W */ //定義application路徑 define('APPPATH', trim(__DIR__ . '/')); //獲得請求地址 $root = $_SERVER['SCRIPT_NAME']; $request = $_SERVER['REQUEST_URI']; $URI = array(); //獲得index.php 後面的地址 $url = trim(str_replace($root, '', $request), '/'); //如果為空,則是訪問根地址 if (empty($url)) { //預設控制器和預設方法 $class = 'index'; $func = 'welcome'; } else { $URI = explode('/', $url); //如果function為空 則預設訪問index if (count($URI) < 2) { $class = $URI[0]; $func = 'index'; } else { $class = $URI[0]; $func = $URI[1]; } } //把class載入進來 include(APPPATH . '/' . 'application/controllers /' . $class . '.php'); //例項化->將控制器首字母大寫 $obj = ucfirst($class); call_user_func_array( //呼叫內部function array($obj, $func), //傳遞引數 array_slice($URI, 2) ); ?>
3、在application/controllers裡面新增下面2個檔案(index.php,hello.php)
① index.php
<?php /** * MVC路由功能簡單實現 * @desc 簡單實現MVC路由功能 * $Author: Zhihua_W */ class Index { function welcome() { # code... echo "default covtroller!"; } } ?>
② hello.php
<?php /** * MVC路由功能簡單實現 * @desc 簡單實現MVC路由功能 * $Author: Zhihua_W */ class Hello{ public function index(){ echo "hello world!"; } public function name($name){ echo "hello ".$name; } } ?>
4、測試
測試一下看看,能不能訪問了。根據上面的路由結構。我們可以來試試。通過測試我們會發現這個訪問正常,正確呼叫了hello這個class內部的name方法,然後把引數jack傳遞過去了。再試試不輸入function name,看看能不能預設呼叫index,答案也是可以的。最後一個就是訪問root地址看看,也是同樣正確的對映到了預設控制器上。(測試結果圖片就不截圖貼上去了。)
這樣,一個簡單的MVC路由功能就完成了。