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

前言

我个人觉得在当前 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(\CodeIgniter\Router\RouteCollectionInterface $routes = null, $getShared = true)
{if ($getShared){return self::getSharedInstance('router', $routes);}if (empty($routes)){$routes = self::routes(true);}return new \CodeIgniter\Router\Router($routes);
}

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

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

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

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

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

handle 方法源码截图

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

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

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

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

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

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

autoRoute 方法

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

autoRoute 方法源码截图

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

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

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

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

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

  6. 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...,并保留此段文字。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282029.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python装饰器执行顺序

2019独角兽企业重金招聘Python工程师标准>>> 1、单个装饰器执行 上来先看代码: import timedef deco(func):functools.wraps(func)def _wrapper():startTime time.time()print "start"func()print "end"endTime time.time()msecs …

99. Recover Binary Search Tree

一、题目 1、审题 2、分析 给出一个二叉查找树,其中有两个元素的位置弄错了,写算法将其恢复。 二、解答 1、思路: 方法一、 通过中序遍历可以确定一棵二叉查找树由小到大的顺序。 所以在此错位的查找树中查找到的节点中有 1 个比后续节点值大…

myeclipse+git pull项目报错

2019独角兽企业重金招聘Python工程师标准>>> 1.在本地工程目录(.git)找到config文件; 2.修改config文件内容为: [core] repositoryformatversion 0 filemode false logallrefupdates true [branch "master"] remote origin m…

如何关掉macbook的开机声音

1、系统偏好设置->声音 2、关掉“启动时播放声音” 这样设置之后,macbook再开机就没有“咚”的那个声音了

oatdata结构详解

段名称 文件内偏移段大小ELF头部0x000000000x00001000oatdata0x000010000x027b8000oatexec0x027b90000x01ed69ecELF尾部0x046900000x00001000OatHeader: 0x00001000 | 6F 61 74 0A 30 33 39 00 77 40 00 B1 03 00 00 00 | 0x00001010 | 01 00 00 00 19 00 00 00 00…

开源 java CMS - FreeCMS2.6 Web页面信息采集

2019独角兽企业重金招聘Python工程师标准>>> java开源论坛系统http://javabbs.javaz.cn 项目地址:http://www.freeteam.cn/ Web页面信息采集 从FreeCMS 2.1开始支持 通过简单配置即可抓取目标网页信息,支持增量式采集、关键字替换、定时采集&…

ORACLE关于段的HEADER_BLOCK的一点浅析

在学习段(segment)、区间(extent)时,对段的HEADER_BLOCK有一些疑问,本文记录一下探究的实验过程以及相关总结,,如有不对的地方,敬请指出。以SCOTT.EMP表为例(…

【源码探索】.NET中的List,为什么即有Count属性又有Count()方法

“优秀的程序员的标准之一是&#xff1a;编写更易于扩展的代码”图片&#xff1a;奥森公园的向日葵 拍摄于2022年7月23日01—问题缘起上一篇中&#xff0c;我们知道List<T>的是基于数组实现的可变长度的列表。很多小伙伴发现&#xff0c;List<T>即有Count属性又有C…

使用ASP.NET广告控件的XML语言创建广告链接--ASP.NET

1、AdRotator广告控件的所有属性都是可选的&#xff0c;XML文件中可以包含如下表所示的属性&#xff08;XML文件的广告属性&#xff09;。 属性 说明 ImageUrl 要显示的图像的URL NavigateUrl 单击AdRotator控件时要转到的网页URL AlternateText 图像不可用时现实的问…

vim编辑和命令模式、实践

2019独角兽企业重金招聘Python工程师标准>>> 9月29日任务 5.5 进入编辑模式 5.6 vim命令模式 5.7 vim实践 Vim编辑模式 进入编辑模式 操作 说明 i 在光标所在字符前插入内容 I 在光标所在行行首插入内容 a 在光标所在字符后插入内容 A 在光标所在行行尾插入…

英语自动提取高频词_斑马英语提分营免费体验课

斑马英语电脑版是一款专业可靠的英语学习软件&#xff0c;斑马英语官方版可以帮助孩子学习纯正的英语口语发音&#xff0c;以讲故事的形式让孩子学习单词及口语练习&#xff0c;斑马英语电脑版针对儿童语言特征设计的智能口语测评系统&#xff0c;能够自动识别发音和评分&#…

【C# Personal Handbook】开篇

博客已提更一年多了&#xff0c;这段时间里&#xff0c;发生了很多事情&#xff0c;也让我对C#更加依恋&#xff0c;所以我决定重新更新博客&#xff0c;以自己的实践经验梳理C#的技术脉络&#xff0c;也欢迎大家手下留情&#xff0c;耐心指点&#xff0c;让我们共同进步吧&…

canvas特效代码详解(2)

canvas是一个就基于像素的画图h5元素。 利用canvas做一个如下描述所示的动态图形&#xff1a;当鼠标点下去时开始绘图&#xff0c;在鼠标结束时完成一个矩形&#xff0c;当再一次点击时重复第一次的绘图步骤。 1 <!DOCTYPE html>2 <html>3 <head>4 …

阿里云三维可视化使用初体验

title: 阿里云三维可视化使用初体验tags: 物联网开发BIMcategories:物联网本文主要的目标是使用阿里云的云产品 - 物联网套件三维可视化 开始 准备工作 进入下载页面下载页面&#xff0c;点击“模型编辑器下载”安装模型编辑器下载安装完毕&#xff0c;启动模型编辑器下载&…

hp laser103 属性没有配置项_(常见解决方法)UEditor报错“后端配置项没有正常加载,上传插件不能正常使用”...

&#xff08;常见解决方法&#xff09;UEditor报错“后端配置项没有正常加载&#xff0c;上传插件不能正常使用”_向来萧瑟也无畏-CSDN博客​blog.csdn.net报错信息详见此文的“排错过程&&错误信息”→ueditor无法上传图片_向来萧瑟也无畏-CSDN博客3种解决方法1.大小写…

WinForm(十二)画图

在.NET中&#xff0c;画图主要是通过Graphics类实现的&#xff0c;这个类主要通过两类方法完成画图&#xff0c;一类是DrawXXX&#xff0c;画各种线条图形&#xff1b;另一类是FillXXX,用各种形状&#xff0c;填充各种图形。Graphics是画板&#xff0c;Draw各个方法是各种盏笔&…

从4个方面简单介绍SaaS

你了解什么是SaaS吗&#xff1f;SaaS有什么优势&#xff1f;选择SaaS平台要注意哪些要素&#xff1f;在这里&#xff0c;怡海软件将针对这些问题进行简单介绍&#xff1a; 什么是SaaS&#xff1f;SaaS是Software-as-a-Service&#xff08;软件即服务&#xff09;的简称&#xf…

终于找到你!如何将前端console.log的日志保存成文件?

本篇文章来自一个需求&#xff0c;前端websocket会收到各种消息&#xff0c;但是调试的时候&#xff0c;我希望把websoekt推送过来的消息都保存到一个文件里&#xff0c;如果出问题的时候&#xff0c;我可以把这些消息的日志文件提交给后端开发区分析错误。但是在浏览器里&…

基于 .NET 6 开发的开源远程终端工具

你好&#xff0c;这里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;有用的工具&#xff0c;不要忘记关注。今天介绍一个非常实用的工具 mRemoteNG&#xff0c;这是一个基于 .NET 6 开发的远程终端软件&#xff0c;开源免费&#xff0c;不用担心版权和软件费用…

第六次作业—例行报告

本周PSP 进度条 代码累计折线图 博文累计折线图 本周饼状图 转载于:https://www.cnblogs.com/zej87/p/7738895.html