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 协议》,转载必须注明作者和本文链接
推荐文章: