前言
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... ,并保留此段文字。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。