什麼是單一入口模式?
單一入口是指整個專案只對外開放 index.php
一個入口檔案,處理所有的 HTTP
請求,根據請求時引數的不同,區分不同模組和操作,而不是專案中的每個功能都提供一個入口檔案。使用單一入口完成框架初始化、載入配置檔案、獲取請求資訊、匹配路由規則,然後根據請求資訊找到對應的模組( Module
)、控制器( Controller
)和操作( Action
)實現具體功能。Laravel
、 ThinkPHP
等都是採用的單一入口模式。
http://diy.tp/index.php/employee/employeeinfo/edit
後面的 /employee/employeeinfo/edit
是傳遞給 PHP
指令碼的附加資訊,由 Nginx
交給 FastCGI
解析。
入口檔案工作流程
修改 index.php
檔案
$pathinfo = !empty($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';
echo $pathinfo;
$_SERVER['PATH_INFO']
用於獲取 URL
中檔案路徑後面的附加資訊,在 Nginx
中這段附加資訊叫做 $fastcgi_path_info
。
在瀏覽器中訪問 http://diy.tp/index.php/employee/employeeinfo/edit
輸出
/employee/employee/edit
在 plubic
目錄下建立 employee
目錄表示 employee
模組,然後在此目錄下分別建立 controller
、 model
、 view
目錄。將此前 public
下的檔案放入相應目錄。
此時目錄結構為
public
├── employee
│ ├── controller
│ │ └── EmployeeController.php
│ ├── model
│ │ └── EmployeeModel.php
│ └── view
│ └── employee.html
└── index.php
提取模組、控制器和操作
$pathinfo = !empty($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';
$arr = explode('/', trim($pathinfo, '/'));
if (!isset($arr[2])) {
exit('該操作不存在!');
}
list ($module, $controller, $action) = $arr;
// 由於在同一目錄 public 之下,不用切換目錄
define('MODULE_PATH', './' . $module . '/');
$controllerName = ucwords($controller) . 'Controller';
$controllerPath = MODULE_PATH . 'controller/' . $controllerName . '.php';
require $controllerPath;
$empolyee = new $controllerName();
$empolyee->$action();
修改控制器中的模型、檢視路徑
class EmployeeController
{
public function index()
{
require MODULE_PATH . 'model/EmployeeModel.php';
$model = new EmployeeModel();
$data = $model->getAll();
require MODULE_PATH . 'view/employee.html';
}
}
訪問 http://diy.tp/index.php/employee/employee/index
本作品採用《CC 協議》,轉載必須註明作者和本文連結