DIY 實現 ThinkPHP 核心框架 (二)入口檔案

cn-five發表於2020-08-25

什麼是單一入口模式?

單一入口是指整個專案只對外開放 index.php 一個入口檔案,處理所有的 HTTP 請求,根據請求時引數的不同,區分不同模組和操作,而不是專案中的每個功能都提供一個入口檔案。使用單一入口完成框架初始化、載入配置檔案、獲取請求資訊、匹配路由規則,然後根據請求資訊找到對應的模組( Module )、控制器( Controller )和操作( Action )實現具體功能。
LaravelThinkPHP 等都是採用的單一入口模式。

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 模組,然後在此目錄下分別建立 controllermodelview 目錄。將此前 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 協議》,轉載必須註明作者和本文連結

相關文章