前言Codeigniter.php是CI4的核心,它接收并处理request请求、安全检查、缓存处理、URL解析和路由匹配,执行filter,加载运行Controller,组装repsonse响应并发送等。先抛一个流程图,然后开始介绍整个大概的流程:注:由于源码较长,就不做完整的截图了截取后,只对关键位置进行截图,直接以源代码文件中的行号为准。run()方法:run方法在Codeigniter初始化后由index.php调用,可以称为核心入口。第185行,起始参考点,用于记录程序的执行时间。第187行,获取请求信息。CodeIgniterHTTPIncomingRequest通过服务容器机制加载,读取并处理HTTPmethod、URI、Headers、Messagebody等信息。第188行初始化响应以向浏览器发送信息。第190行,是否强制https访问。第194和185行处理缓存。第197行,检查post中是否有_method字段重新定义了http请求方法。该特性主要用于重新定义使用Restful特性时浏览器不支持的put、delete等特性。第200行,尝试处理这个请求,详见handleRuest()方法。之后,这些行主要处理如何处理解析等一些错误。handleRuest()方法该方法查找并执行控制器,并将执行后得到的响应内容发送给浏览器。233行,解析路由,详见tryToRouteIt()方法236-241行,解析并执行过滤器,过滤器可以想象成上一个版本的钩子,用于在某些特定动作之前或之后执行一些自定义代码点。243行,关键点,开始涉及控制器。这一行执行startController方法。看起来controller已经被执行了,但实际上这更像是一个beforeController。只有在Controller为闭包时才直接执行。如果不是闭包,那么这个方法只是做一些Detecting的工作,判断当前Controller是否存在。在第248行,createController方法执行了如下代码:new$this->controller($this->request,$this->response),可以看出常规controller对象此时才出现。第251行调用了post_controller_constructor事件,但是源码中的注释又提到了hook。我个人觉得hook、event、filter有时候可以放在一起分析。它们非常相似,不是吗?第253行,controllerrun,此时自定义controller才真正执行。CI4中的view机制不再是load方法,而是和laravel一样的return方法。在controller中只生成view的string返回给codeigniter的核心对象,由核心对象继续处理。第264行,gatherOutput通过ob_*函数收集输出内容。第267行,after过滤器被执行。第280行,向浏览器发送信息。tryToRouteIt()方法该方法主要是在url信息中查找controller在什么位置。第590-592行读取配置文件中的自定义路由。路由配置与以前的版本略有不同。具体到路由章节深入分析。第596行,获取路由对象。具体的路由逻辑在这个对象中。598行,处理cli和web下不同的路径形式。603行,收集输出信息(视图)。605行,获取控制器,这里只是为了找到控制器所在的位置。如何获取,后面会有相应的章节。606行,获取方法,这里只是找到方法所在的位置。如何获取,后面会有相应的章节。第610-613行处理国际化问题。tryToRouteIt执行完后,会返回handleRequest,执行刚刚在handleRequest中找到的controller和method并收集controller中的returnviewstring,通过gatherOutput方法获取输出,handleRequest输出完成后返回run方法.run方法然后返回到index.php。至此,CI的主要执行流程就完成了。总结Codeigniter.php是CI的核心文件。它被index.php调用后,完成了很多主要的流程操作。下一节将详细介绍路由过程。本文可转载,但转载前需发邮件至imustgxd*sina.cn进行交流,未交流的视为侵权。转载时必须注明原文链接(https://segmentfault.com/a/11...),并保留该段文字。
