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

前言

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

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

Codeigniter.php 流程图

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

run() 方法:

run 方法是在 Codeigniter 初始化后由 index.php 调用的,能够称做为核心的入口。segmentfault

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

相关文章
相关标签/搜索