2

前言

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

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

Codeigniter.php 流程图

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

run() 方法:

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

run 方法源码截图

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

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

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

  4. 190 行,是否强制 https 访问。

  5. 194,185 行,处理缓存。

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

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

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

handleRuest() 方法

handleRuest 方法源码截图

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

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

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

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

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

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

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

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

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

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

tryToRouteIt() 方法

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

tryToRouteIt 方法源码截图

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

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

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

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

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

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

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


sheld
652 声望33 粉丝

我是什么都不知道啊