PHP编写一个简单的路由类

Noah
Noah
发布时间:2026-10-15| 6人浏览过
原创

本文介绍如何使用纯PHP编写一个基础的路由解析类,通过解析服务器环境变量提取控制器、操作方法及额外参数,适用于简单的MVC架构路径处理。

结果与目标

该代码的主要目标是替代简单的$_GET参数传递,使URL更加整洁(伪静态)。它将从URL中提取三部分信息:

  1. Controller:控制器名称
  2. Operate:具体的操作方法
  3. params:额外的路径参数数组

准备条件

确保服务器环境支持PATH_INFO变量。这通常需要在服务器配置(如Nginx的重写规则或Apache的AllowPathInfoOnTrailingSlash)中开启对路径信息的识别。默认情况下,如果未提供路径后缀,脚本会自动尝试从SCRIPT_NAME剥离前缀进行兼容处理。

真实操作顺序

第1步:定义Router类结构

创建一个名为Router的类,核心方法为getRouter。该方法接受一个$types参数来决定URL的分隔符类型:

  • 1:使用斜杠 / 分隔(例如:site.com/controller/action)
  • 2:使用横杠 - 分隔(例如:site.com/controller-action)
  • 3:仅返回默认的Controller参数(用于特定简略路由场景)
<?php
class Router
{
    public function getRouter($types = 1)
    {
        // 获取原始路径信息
        if ( isset($_SERVER['PATH_INFO']) ) 
        {
            // 移除常见的静态文件后缀以防止误判
            $query_string = substr(str_replace(array('.html','.htm', '.asp', '//'), '',$_SERVER['PATH_INFO']),1);
        } 
        else 
        {
            // 降级方案:处理没有PATH_INFO的情况
            $query_string = str_replace($_SERVER['SCRIPT_NAME'], '',$_SERVER['PHP_SELF']);
        }

        // 根据类型选择分割方式
        if ( $types == 1 ) 
        {
            $temp = explode('/', $query_string);
        } 
        elseif ($types == 2) 
        {
            $temp = explode('-', $query_string);
        } 
        elseif ($types == 3) 
        {
            return array('Controller'=>$_GET['controller']);
        }

        // 默认值处理
        if ( empty($temp[0]) ) 
        {
            return array('Controller' => 'index','Operate' => 'index');
        }
        if ( empty($temp[1]) ) 
        {
            $temp[] = 'index';
        }

        // 清理空字符串项
        foreach ($temp as $val) 
        {
            if ($val)
            {
                $url[] = $val;
            }
        }
        
        list($controller, $operate) = $url;
        
        // 提取剩余参数
        $params = array();
        if ( count($url)>2 )
        {
            array_shift($url);
            array_shift($url);
            $params = $url;
        }

        return array(
            "Controller" => $controller,
            "Operate" => $operate,
            "params" => $params,
        );
    }
}
?>

第2步:实例化并调用路由类

在入口文件(如index.php)中实例化该类,并根据实际需求传入类型参数。调用后即可通过返回数组获取路由结构。

<?php
$url = new Router();
// 使用第一种模式:/ 分隔
$result = $url->getRouter(1); 
print_r($result); 
?>

完成判断

执行上述代码后,若访问类似于 example.com/user/list/all 的地址,控制台输出的数组应包含以下关键数据(以类型1为例):
- Controller: user
- Operate: list
- params: array('all')

若访问地址仅为根目录或格式不符,代码会默认回退到 index 作为控制器和方法。

简要总结

以上就是基于PATH_INFO的PHP简单路由解析类的详细内容。这种轻量级的处理方式适合小型项目快速构建MVC结构的底层分发逻辑。更多关于PHP框架设计原理的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。