PHP單一檔案入口框架簡析

dodo發表於2019-01-25

單一檔案入口應用,所有請求都是通過index.php接收並轉發到功能程式碼中去,因此一些事情變得簡單多了,如資料安全性檢查,訪問統計等。

當前比較流行的一些PHP開發框架如LaravelThinkPHP等都是採用的單一入口模式。

下面我們們來實現一個簡單版的單一檔案入口框架,包括MVC架構、URL路由的實現。

MVC架構

PHP單一檔案入口框架簡析
MVC架構

Controller控制器是ModelView兩者互動的中介,Model模型層負責讀寫資料,View檢視層負責檢視處理輸出。

URL路由原理

基本思路就是瀏覽器端通過URL字串提供控制器的名字和方法的名字,PHP據此找到對應的類和方法。

為方便測試,把所有功能寫一個檔案,實際框架每個類為一個檔案,入口一個檔案。


/**
 * PHP單一檔案框架設計簡析
 * 1、MVC架構實現
 * 2、URL路由原理
 */

//URL路由原理
/**
 *  路由作用
 * 獲取url中的c和a變數,執行c類對應的方法a,實現不同的路由
 */
class App {
    public $c;
    public $a;

    public function run()
    {
        $c = isset($_GET[`c`]) ? $_GET[`c`] : "Index"; //url提供類名字的變數名
        $a = isset($_GET[`a`]) ? $_GET[`a`] : "Index"; //url提供方法名字的變數名

        $c .= "Controller";
        if( class_exists($c) && method_exists($c, $a) ) {
            $o = new $c();  
            $o->$a();  
        }else{  
            echo "error";  
            exit();
        }
    }
}

//MVC架構
/**
 * 模型層
 * 獲取應用資料作用
 */
class Model {
    //TODO:link db、get data
}

/**
 * 檢視類
 * 編譯、快取及顯示模板
 */
class View {
    public function render($tpl)
    {
        echo "Hi, ".$tpl; //TODO:具體html模板
    }
}

/**
 * 控制器
 * 所有功能控制器繼承該類
 */
class Controller {
    public $view;
    public $model;

    public function __construct()
    {
        $this->view = new View();
        $this->model = new Model();
    }

    public function display($tpl = "")
    {
        echo $this->view->render($tpl);
        exit();
    }
}

//具體功能開發
class IndexController extends Controller {
    /**
     * 網站首頁
     */
    public function Index()
    {
        $this->display("Index");
    }
    /**
     * 網站列表
     */
    public function List()
    {
        $this->display("List");
    }
}

//單一檔案入口
$app = new App();
$app->run();
?>複製程式碼

以上程式碼儲存為index.php,然後瀏覽
http://localhost/index.php?c=Index&a=Index
http://localhost/index.php?c=Index&a=List
可看到經過我們的路由後輸出不同內容!

相關文章