DIY 实现 ThinkPHP 核心框架 (二)入口文件
什么是单一入口模式?
单一入口是指整个项目只对外开放 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 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: