單一檔案入口應用,所有請求都是通過index.php
接收並轉發到功能程式碼中去,因此一些事情變得簡單多了,如資料安全性檢查,訪問統計等。
當前比較流行的一些PHP開發框架如Laravel
、ThinkPHP
等都是採用的單一入口模式。
下面我們們來實現一個簡單版的單一檔案入口框架,包括MVC架構、URL路由的實現。
MVC架構
Controller
控制器是Model
和View
兩者互動的中介,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();
?>?php>複製程式碼
以上程式碼儲存為index.php
,然後瀏覽
http://localhost/index.php?c=Index&a=Index
http://localhost/index.php?c=Index&a=List
可看到經過我們的路由後輸出不同內容!