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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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