资讯专栏INFORMATION COLUMN

Codeigniter 4.0-dev 版源码学习笔记之四——详细路由过程

NSFish / 1107人阅读

摘要:行,判断如果为空,那么返回默认路由。行,把处理完毕后找到的返回。方法该方法是自动按着约定规则去目录去找路由的过程。此文可以转载,但转载前需要发邮件到进行沟通,未沟通的均视作侵权。

前言

我个人觉得在当前 MVC 流行的架构下,要想去了解一个框架,或者是一个基于此架构下的应用程序,最好的入手方式就是先看路由,虽然路由不是 MVC 里的任何一个,但是知道了路由的来龙去脉就知道了整个框架或者是应用的结构。从一个请求开始,具体分配到哪个 C 去执行的, C 里又调用了哪些东西,整个脉络也就清晰了。

然而整个路由的实现的逻辑本身又是比较好理解的,无非就是从请求的 URL 中按着约定的规则取出 C 对应的 class 以及 method 即可。如此,我们接下来详细看看 CI 4 dev 版的路由具体实现的逻辑。

找到路由逻辑的具体位置

上一节我们说 Codeigniter.php 的时候讲到, index.php 入口文件通过 $app->run() 调取了 Codeigniter 类中的 run 方法。 run 中又执行了 handleRequest 方法用来处理请求的具体信息。接着 handleRequest 调取 tryToRouteIt 来尝试解析路由,此时代码逻辑还在 Codeigniter.php 里,真正的解析过程还没有开始。在 tryToRouteIt 方法中,通过 service 方式加载了 router 类,通过 system/config/service 加载 router 代码如下,这也是一个服务加载的统一形式,其它的核心辅助类都是如此加载:

public static function router(CodeIgniterRouterRouteCollectionInterface $routes = null, $getShared = true)
{
    if ($getShared)
    {
        return self::getSharedInstance("router", $routes);
    }

    if (empty($routes))
    {
        $routes = self::routes(true);
    }

    return new CodeIgniterRouterRouter($routes);
}

从 倒数第二行可以看出加载的 router 类位于 system/router 下的 Router 类里。

system/router/Router.php 解析路由的详细过程

首先我们把 Codeigniter.php 中调用该类的详细代码列出来如下:

$this->controller = $this->router->handle($path);
$this->method     = $this->router->methodName();

关键的只有两行,一行找类一行找方法。找类的那一行处理了大部分的逻辑,找方法的那一行就是简单的 get 。

146-150 行,判断 $uri 如果为空,那么返回默认路由。因为在该类的构造方法里读取了配置中的默认路由,因此此处直接返回配置即可。

153-156 行,检查路由配置文件里的配置是否有和当前匹配的 URL ,有的话,直接返回配置的控制器即可。

161-164 行,检查是否开启了自动路由匹配,如果没有开启,那么读取完配置好的路由都没有结果,那么就可以 throw pageNoteFoundException 了。

166 行,真正的处理 CI 路由逻辑的地方。详细见 autoRoute 方法。

168 行,把处理完毕后找到的 controller 返回。

此方法通过调用其它方法已经实现了寻找 controller 的过程,主流程到此已经结束。

autoRoute 方法

该方法是自动按着约定规则去 controller 目录去找路由的过程。

442 行:将 URI 按着 / 打散成数组。

444 行:确定 URI 里是否包含 Controller 的目录部分。该方法将 $segments 数组由 0 元素一次一次循环并匹配 application/controller 下的目录,找到后并且该目录下没有同名的 PHP 文件即认为是路径组成部分,同时将该元素从 $segments 中去除,以保证 $segments 中剩下的仅仅是 class 与 method 内容。

448-456 行:去除路径后发现 $segments 数组没元素啦,那么只能是默认处理了。否则直接弹出数组中的第一个元素即是 class 信息。

461-464 行:如果此时 $segments 中不为空,那么弹出数组中第一个元素是 method 信息。

466-469 行:如果此时 $segments 中还不为空,那么剩下的就是传递的参数信息。

472-476 行:判断代表 controller 的文件存在的话 include 进来。

小结

至此,路由部分处理完了,找到的 controller 与 method 信息分别放到了对象对应的属性里。因此在 codeigniter.php 中用以下两行就拿到了相应的信息:

$this->controller = $this->router->handle($path);
$this->method     = $this->router->methodName();

下一章应该会看看 CI 4 相对 CI 3 的变化。

此文可以转载,但转载前需要发邮件到imustgxd*sina.cn进行沟通,未沟通的均视作侵权。 转载同时需注明原文链接
(https://segmentfault.com/a/11...,并保留此段文字。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22938.html

相关文章

  • Codeigniter 4.0-dev 源码学习笔记之三——核心文件 Codeigniter.ph

    摘要:行,是否强制访问。行,尝试处理此次请求,详细见方法。至此,的执行主流程完毕。小结是的核心文件,它被调用后,完成了诸多的主流程操作。此文可以转载,但转载前需要发邮件到进行沟通,未沟通的均视作侵权。 前言 Codeigniter.php 是 CI 4 的核心所在,在这里接收并处理了 request 请求,安全检查,缓存处理, URL 解析以及路由匹配,执行过滤器,加载运行 Controll...

    alighters 评论0 收藏0
  • Codeigniter 4.0-dev 源码学习笔记之五——相对于 3.x 的变化

    摘要:支持命名空间是没有支持命名空间的。配置文件不再是简单数组了新的配置文件是以对象组织的,各个配置以对象的属性形式暴露出来。此文可以转载,但转载前需要发邮件到进行沟通,未沟通的均视作侵权。 前言 CI 为了追上大家的脚步,这次跨了一大步,尽量使用了更多的流行设计理念,甚至连 PHP 的支持版本都是从 7 开始起步的。我在之前阅读源码的同时也发现了很多变化的地方,在此把已经发现的列举出来,不...

    Youngdze 评论0 收藏0
  • Codeigniter 4.0-dev 源码学习笔记之六——控制器

    摘要:控制器严格来说,这个是控制器父类的源码。在中,控制器仅负责接到返回的组装的页面字符串,并回核心中,由核心再处理后续事宜。此文可以转载,但转载前需要发邮件到进行沟通,未沟通的均视作侵权。 前言 其实一开始我是很纠结是否要写控制器的源码分析的,因为控制器的源码太少了,少到你不相信这是一个 MVC 里的一个重头。直觉里,大家都觉得控制器作为各个请求的入口,其后端应该有很多很多的代码支撑才可以...

    asce1885 评论0 收藏0
  • Codeigniter 4.0-dev 源码学习笔记之一——前言以及 CI 4 预览

    摘要:版权声明可转载,但不论任何媒体都需要在转载前与本人沟通,并在转载时注明出处。的各个核心模块以模块名为目录名分别存储在这个目录下。下一篇文章会涉及到和。此文可以转载,但转载前需要发邮件到进行沟通,未沟通的均视作侵权。 写在前面: 为什么选择开发过程中的 CI 4 作为源码解读版本:(1)首先我选 CI 是因为它之前的稳定版都是相对比较轻量小巧的,而且可以认为是简单的。(2)为什么没有选...

    MSchumi 评论0 收藏0
  • Codeigniter 4.0-dev 源码学习笔记之二——入口以及初始化操作

    摘要:通过这个函数可以很方便的在程序运行期间执行很多常见操作。此文可以转载,但转载前需要发邮件到进行沟通,未沟通的均视作侵权。 index.php index.php 是整个框架的入口文件,也就是说所有的请求都要从它这里开始。因为 index.php 源码非常简洁,那么我们直接放一张源码截图,按着截图说一下源码。 showImg(https://segmentfault.com/img/re...

    _ivan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<