• PHP框架开发实践 | 1024 程序员节:通过index.php找到对应的controller是如何实现的


    在这里插入图片描述

    🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。
    🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。
    🏆本文已收录于PHP专栏:PHP进阶实战教程
    🎉欢迎 👍点赞✍评论⭐收藏


    一、前言

    在现代Web开发中,使用框架可以大幅度提高开发效率,减少不必要的重复劳动。本文将手把手教你如何编写一个简单的PHP框架,实现单一入口、路由解析到controller。最后,通过一个URL来访问控制器,并输出Hello, CSDN 1024

    在这里插入图片描述

    二、什么是框架?

    框架是一个具有基础功能和结构的软件工具,旨在协助开发者快速构建应用程序。它提供了一组规范、约定和工具,使得开发者可以专注于业务逻辑而不是重复的编码工作。PHPThinkPHPLaravel都是比较流行的开发框架。

    在这里插入图片描述

    三、功能实现

    3.1 单一入口

    单一入口是指整个应用程序只有一个入口文件,所有的HTTP请求都通过这个入口文件处理。这样做的好处是可以集中处理所有的请求,并且可以方便地对请求进行拦截、过滤和处理。

    我们先创建一个名为index.php的入口文件,并在其中初始化一些必要的常量和配置。比如:

    
    define('ROOT_PATH', __DIR__ . '/');
    define('APP_PATH', ROOT_PATH . 'app/');
    // ... 其他常量和配置
    
    require_once(ROOT_PATH . 'framework/router.php');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在上面的代码中,我们定义了两个常量ROOT_PATHAPP_PATH,分别表示项目的根路径和应用程序的路径。接下来,我们引入了一个叫做router.php的文件,这个文件将负责路由解析。

    3.2 路由解析

    路由解析是指将URL中的路径和参数映射到应用程序的具体逻辑处理部分。在框架中,我们可以通过正则表达式或其他方式来实现路由解析。

    我们创建一个名为router.php的文件,并在其中写下以下代码:

    
    // 获取请求的URL路径
    $requestUri = $_SERVER['REQUEST_URI'];
    
    // 去除URL中的查询参数
    $urlPath = parse_url($requestUri, PHP_URL_PATH);
    
    // 根据URL路径匹配路由规则
    switch ($urlPath) {
        case '/':
            require_once(APP_PATH . 'controllers/homeController.php');
            $controller = new HomeController();
            $controller->index();
            break;
        // 其他路由规则...
        default:
            http_response_code(404);
            echo "Page not found";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    上面的代码中,我们首先通过$_SERVER['REQUEST_URI']获取当前请求的URL路径,然后使用parse_url()函数去除掉其中的查询参数。接下来,我们使用switch语句对URL路径进行匹配,当URL路径为/时,我们加载HomeController并执行其index方法;当URL路径不匹配任何已定义的路由规则时,返回404错误。

    3.3 通过URL访问控制器

    我们首先创建一个名为HomeController.php的文件,写下以下代码:

    
    class HomeController {
        public function index() {
            echo 'Hello, CSDN 1024';
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    上面的代码中,我们定义了一个HomeController类,并在其中定义了一个index方法,该方法将输出Hello, CSDN 1024

    接下来,我们再次修改router.php文件,实现通过URL访问控制器的功能。修改后的代码如下:

    
    // 将URL路径按'/'分割成数组
    $urlSegments = explode('/', trim($urlPath, '/'));
    
    // 获取控制器名称和方法名称
    $controllerName = ucfirst($urlSegments[0]) . 'Controller';
    $methodName = isset($urlSegments[1]) ? $urlSegments[1] : 'index';
    
    // 根据控制器名称加载对应的控制器文件
    $controllerFile = APP_PATH . "controllers/{$controllerName}.php";
    if (file_exists($controllerFile)) {
        require_once($controllerFile);
    
        // 实例化控制器对象,并调用对应的方法
        $controller = new $controllerName();
        if (method_exists($controller, $methodName)) {
            $controller->$methodName();
        } else {
            http_response_code(404);
            echo "Method not found";
        }
    } else {
        http_response_code(404);
        echo "Page not found";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在上面的代码中,我们首先使用explode函数将URL路径按’/'分割成数组,然后通过ucfirst函数将控制器名称的首字母大写,加上Controller后缀。接下来,我们检查对应的控制器文件是否存在,如果存在则加载该文件,并实例化控制器对象。最后,调用对应的方法。

    四、总结

    通过以上的步骤,我们手把手地编写了一个简单的PHP框架,实现了单一入口、路由解析。这个模块虽然简单,但已经具备了基本的功能,可以用于开发一些小型的Web应用。当然,在实际开发中,还需要更多的功能和优化。

    在这里插入图片描述

    希望通过这篇博文,你能够对PHP框架的实现有一个初步的了解,并且理解单一入口、路由解析和Controller的原理和作用。通过不断地学习和实践,你将能够编写出更完善和高效的框架,提高自己的开发效率和编程水平。

  • 相关阅读:
    M的编程备忘录之C++——类和对象(上)
    算法通关村第十六关:白银挑战-滑动窗口经典问题
    (二)正则表达式——捕获
    Python求解不等式优化问题
    阿里云张新涛:连接产业上下游,构建XR协作生态
    87.(cesium篇)cesium热力图(贴地形)
    StratifiedKFold 函数介绍
    【LLMs】从大语言模型到表征再到知识图谱
    jdbc技术实现插入数据,更新和删除操作,查询操作
    Epoll:让IO多路复用变得有趣
  • 原文地址:https://blog.csdn.net/qq_21891743/article/details/133903579