PHP 路由技术的原理与实践

发布于 2025-06-10 02:00:11 字数 2301 浏览 1 评论 0

0x00 路由实现原理

用户通过指定的 URL 范式对后台进行访问,URL 路由处理类进行处理后,转发到逻辑处理类,逻辑处理类将请求结果返回给用户。

约定 URL 范式和规则

约定一套自己喜欢的,对搜索引擎友好,对用户友好的 URL 规则

URL 处理类

对用户请求的 URL 进行解析处理,获取到用户请求的类,方法,以及 Query 参数等,并将请求转发给逻辑处理类。

逻辑处理类

处理网站的真实业务逻辑。

0x01 URL 范式约定

目前来说,有两种比较流行的 URL 格式,一种是普通模式,一种是 pathinfo 模式。

普通模式

ThinkPHP 框架中,默认的 URL 格式即为普通模式,普通模式 URL 如下:

index.php?m=home&c=user&a=login&v=value

其中 m 参数的值为模块名称, c 参数的值为控制器名称, a 参数的值为方法名称,之后的参数则为该方法中所要接收的其他 GET 请求参数

pathinfo 模式

CodeIgniter 框架中,默认的 URL 格式为 pathinfo 模式,如下:

index.php/controller/method/prarme1/value1

这块的意义也已经标注的很明白了,在 method 以后,就是方法接收的 GET 参数了,格式就是 名称/值

0x02 URL 路由处理类(核心)

此处我们选用最简单的普通单模块模式进行演示,只为说明简单的原理,如下:

index.php?c=user&a=login&v=value

我们约定参数 c 为控制器名称,参数 a 为方法名称,之后的均是 GET 参数

<?php
include 'index.class.php';
include 'user.class.php';
// 对用户请求 URL 进行处理
$query = $_GET;
$controller = isset($query['c']) ? $query['c'] : 'indexController';
$action = isset($query['a']) ? $query['a'] : 'index';
if (class_exists($controller)) {
    if (method_exists($controller, $action)) {

        unset($_GET['c']);
        unset($_GET['a']);
        // 实例化用户请求类并调用方法
        (new $controller())->$action();

    } else {
        echo '控制器' . $controller . '中不存在方法' . $action;
    }
} else {
    echo '不存在控制器' . $controller;
}

其中 unset() 掉两个 get 参数,只是为了对真正调用的方法造成其他影响。

0x03 逻辑处理类

逻辑处理类就是最终的业务逻辑,也就是真正的回应用户请求的代码片段。下面只是一个简单的示例:

/* index.class.php 文件源码 */
<?php
class indexController {

    public function index(){
        var_dump($_GET);
    }
}
/* user.class.php 文件源码 */
<?php
class user {

    public function index() {
        echo '这里是 User 控制器';
    }

    public function login() {
        var_dump($_GET);
    }
}

0x04 结束

这里只是最简单的 PHP 路由技术的原理,其实真正为一个项目或者框架进行路由开发,可能需要能够兼容很多复杂的情况,需要对各种情况都要考虑到。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。