摘要:行,是否强制访问。行,尝试处理此次请求,详细见方法。至此,的执行主流程完毕。小结是的核心文件,它被调用后,完成了诸多的主流程操作。此文可以转载,但转载前需要发邮件到进行沟通,未沟通的均视作侵权。
前言
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
摘要:版权声明可转载,但不论任何媒体都需要在转载前与本人沟通,并在转载时注明出处。的各个核心模块以模块名为目录名分别存储在这个目录下。下一篇文章会涉及到和。此文可以转载,但转载前需要发邮件到进行沟通,未沟通的均视作侵权。 写在前面: 为什么选择开发过程中的 CI 4 作为源码解读版本:(1)首先我选 CI 是因为它之前的稳定版都是相对比较轻量小巧的,而且可以认为是简单的。(2)为什么没有选...
摘要:通过这个函数可以很方便的在程序运行期间执行很多常见操作。此文可以转载,但转载前需要发邮件到进行沟通,未沟通的均视作侵权。 index.php index.php 是整个框架的入口文件,也就是说所有的请求都要从它这里开始。因为 index.php 源码非常简洁,那么我们直接放一张源码截图,按着截图说一下源码。 showImg(https://segmentfault.com/img/re...
摘要:行,判断如果为空,那么返回默认路由。行,把处理完毕后找到的返回。方法该方法是自动按着约定规则去目录去找路由的过程。此文可以转载,但转载前需要发邮件到进行沟通,未沟通的均视作侵权。 前言 我个人觉得在当前 MVC 流行的架构下,要想去了解一个框架,或者是一个基于此架构下的应用程序,最好的入手方式就是先看路由,虽然路由不是 MVC 里的任何一个,但是知道了路由的来龙去脉就知道了整个框架或者...
摘要:支持命名空间是没有支持命名空间的。配置文件不再是简单数组了新的配置文件是以对象组织的,各个配置以对象的属性形式暴露出来。此文可以转载,但转载前需要发邮件到进行沟通,未沟通的均视作侵权。 前言 CI 为了追上大家的脚步,这次跨了一大步,尽量使用了更多的流行设计理念,甚至连 PHP 的支持版本都是从 7 开始起步的。我在之前阅读源码的同时也发现了很多变化的地方,在此把已经发现的列举出来,不...
摘要:控制器严格来说,这个是控制器父类的源码。在中,控制器仅负责接到返回的组装的页面字符串,并回核心中,由核心再处理后续事宜。此文可以转载,但转载前需要发邮件到进行沟通,未沟通的均视作侵权。 前言 其实一开始我是很纠结是否要写控制器的源码分析的,因为控制器的源码太少了,少到你不相信这是一个 MVC 里的一个重头。直觉里,大家都觉得控制器作为各个请求的入口,其后端应该有很多很多的代码支撑才可以...
阅读 3927·2021-11-22 15:31
阅读 2479·2021-11-18 13:20
阅读 2852·2021-11-15 11:37
阅读 6711·2021-09-22 15:59
阅读 701·2021-09-13 10:27
阅读 3708·2021-09-09 09:33
阅读 1397·2019-08-30 15:53
阅读 2532·2019-08-29 15:37