资讯专栏INFORMATION COLUMN

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

alighters / 418人阅读

摘要:行,是否强制访问。行,尝试处理此次请求,详细见方法。至此,的执行主流程完毕。小结是的核心文件,它被调用后,完成了诸多的主流程操作。此文可以转载,但转载前需要发邮件到进行沟通,未沟通的均视作侵权。

前言

Codeigniter.php 是 CI 4 的核心所在,在这里接收并处理了 request 请求,安全检查,缓存处理, URL 解析以及路由匹配,执行过滤器,加载运行 Controller ,组装 repsonse 响应并发送等。

首先扔一张流程图,后续我们将开始介绍整个大致流程:

注:因源码较长,不再完完整截图,仅截图关键位置,并直接使用源码文件中的行号作为导引。

run() 方法:

run 方法是在 Codeigniter 初始化后由 index.php 调用的,可以称作为核心的入口。

185 行,开始基准点,用于记录程序执行耗时。

187 行,获取 request 信息。通过 service 容器机制加载了 CodeIgniterHTTPIncomingRequest 读取处理了HTTP method 、 URI 、 Headers 、 Message body 等信息。

188 行,初始化 response ,用于发送信息给浏览器。

190 行,是否强制 https 访问。

194,185 行,处理缓存。

197 行,检测post中是否有 _method 字段重新定义了 http 请求方法。该特性主要用于 Restful 特性时重定义浏览器不支持的 put 、 delete 等特性。

200 行,尝试处理此次请求,详细见 handleRuest() 方法

之后这些行主要处理在发生解析等一些错误时应对方法。

handleRuest() 方法

该方法找到并执行 controller 并把执行后得到的 response 内容发给浏览器。

233 行,解析路由,具体见 tryToRouteIt() 方法

236-241 行,解析并执行过滤器,过滤器可想像成之前版本的钩子,用于在某些特定的动作点之前或者之后执行一些自定义代码。

243 行,划重点,开始涉及到 controller 了。本行执行了 startController 方法,看起来是已经执行了 controller ,但实际上这个更像是 before Controller ,只有 Controller 是一个闭包的时候才直接执行了,如果不是闭包,那么这个方法仅仅做了一些检测工作,判断当前 Controller 存不存在等。

248 行, createController 方法执行了如下代码: new $this->controller($this->request, $this->response) ,可见常规的 controller 对象此时才出现。

251 行,调用了 post_controller_constructor 事件,但是源码中的注释又提到了 hook 。个人觉得有时可以把 hook 、 event 、 filter 放在一起分析,它们很相似不是吗。

253 行,run 了 controller 此时是真正执行了自定义的 controller 。CI 4 中的 view 机制不再是 load 方式,而是和 laravel 一样的 return 方式,在 controller 里仅仅是生成了 view 的字符串并 return 回 codeigniter 核心对象,由核心对象来继续处理。

264 行,gatherOutput 通过 ob_* 系函数收集输出内容。

267 行,执行了 after 的过滤器。

280 行,发送信息到浏览器。

tryToRouteIt() 方法

该方法主要在 url 信息中找到 controller 在哪里。

590-592 行,读取配置文件里的自定义路由。路由的配置与之前版本有了小小的变动。具体到路由章节深入分析。

596 行,拿到 route 对象。具体路由逻辑都在这个对象里。

598 行,处理 cli 与 web 下不同的路径形式。

603 行,从此处开始收集输出信息 (view) 。

605 行,拿到 controller ,此处仅仅是找到 controller 的位置。具体如何拿到,后续会有相应章节。

606 行,拿到 method ,此处仅仅是找到 method 的位置。具体如何拿到,后续会有相应章节。

610-613 行,处理国际化问题。

tryToRouteIt 执行完毕后将会返回到 handleRequest ,在 handleRequest 里执行了刚刚找到的 controller 和 method 并收集 controller 中 return 回的 view 字符串,通过 gatherOutput 方法拿到输出,输出完毕后 handleRequest 返回到 run 方法。 run 方法再返回到 index.php 。至此, CI 的执行主流程完毕。

小结

Codeigniter.php 是 CI 的核心文件,它被 index.php 调用后,完成了诸多的主流程操作。

下一节将详细看看路由的过程。

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

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

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

相关文章

  • 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
  • Codeigniter 4.0-dev 源码学习笔记之四——详细路由过程

    摘要:行,判断如果为空,那么返回默认路由。行,把处理完毕后找到的返回。方法该方法是自动按着约定规则去目录去找路由的过程。此文可以转载,但转载前需要发邮件到进行沟通,未沟通的均视作侵权。 前言 我个人觉得在当前 MVC 流行的架构下,要想去了解一个框架,或者是一个基于此架构下的应用程序,最好的入手方式就是先看路由,虽然路由不是 MVC 里的任何一个,但是知道了路由的来龙去脉就知道了整个框架或者...

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

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

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

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

    asce1885 评论0 收藏0

发表评论

0条评论

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