DIY 实现 ThinkPHP 核心框架 (二)入口文件

什么是单一入口模式?

单一入口是指整个项目只对外开放 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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!