1. 程式人生 > >PHP簡單實現MVC框架路由功能模式

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路由功能就完成了。