DIY 实现 ThinkPHP 核心框架 (三)路由
框架路由的两种方式
在框架中,有两种方式将请求信息分发到具体的控制器。第一种是在入口文件 index.php
后面添加“/模块/控制器/操作”。这种方式使得 URL
显得过于累赘,并且限制了 URL
的格式,不能随意自定义。另一种是通过定义路由规则对 URL
进行匹配,找到相应的模块、控制器和操作。
路由的实现原理
在 ThinkPHP
中,框架会自动识别 URL
中的模块、控制器和操作,无需开发人员专门定义路由规则。
隐藏入口文件
原 URL
http://diy.tp/index.php/employee/employee/index
过长,希望换成一个简化地址 http://diy.tp/index
。
向 Nginx
配置文件中的 server
段添加
location / {
root /root/web/mytp/public;
index index.html index.htm index.php;
# $request_filename 表示请求参数 也就是 diy.tp/ 之后的部分
# 例如 diy.tp/index $request_filename 就是 index
# !-e 表示不存在
if (!-e $request_filename) {
# ^(.*)$ 表示请求路径 比如 index
# $1 表示引用 ^(.*)$
# 也就是说如果 index 不存在
# 重写为 /index.php/ 开头的 URL diy.tp/index.php/index
# last 的状态码是 301 表示跳转至重写的 URL
rewrite ^(.*)$ /index.php/$1 last;
break;
}
}
在 /home/web/mytp
目录创建 application
目录,将 public/employee
目录放入 application
目录中。
application
└── employee
├── controller
│ └── EmployeeController.php
├── model
│ └── EmployeeModel.php
└── view
└── employee.html
public
目录只有入口文件 index.php
提供对外访问,目录安全性高,耦合低,不影响重写。
定义路由规则
更改 index.php
$pathinfo = !empty($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';
// 定义路由规则
$route = [
'index' => '/employee/employee/index',
];
$pathinfo = trim($pathinfo, '/');
$pathinfo = $route[$pathinfo] ?? '';
$arr = explode('/', trim($pathinfo, '/'));
if (!isset($arr[2])) {
exit('该操作不存在!');
}
list ($module, $controller, $action) = $arr;
// 目录改变 需从上一级目录进入 application
define('MODULE_PATH', '../application/' . $module . '/');
$controllerName = ucwords($controller) . 'Controller';
$controllerPath = MODULE_PATH . 'controller/' . $controllerName . '.php';
require $controllerPath;
$empolyee = new $controllerName();
$empolyee->$action();
测试 diy.tp/index
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: