TP5源码:框架执行流程与路由解读(一)
前面的我们分析了类的自动加载机制,容器类以及facade模式。接下来我们继续研究run方法
run() 做了哪些工作?:
Container:: get('app')最终将指向了 think\App.php类。仔细观察run方法内部结构,发现run方法主要进行了以下几步操作(ps:太长了,这里不贴代码了,挑几个主要的来记)
1. initialize方法中的初始化应用:
run()内部首先调用了initialize(),而initialize()的作用就是初始化应用!
如下图所示 initialize() 主要设置了很多全局变量(当然还有很多额外的操作了。。。)
initialize()里的init()方法也是起到了初始化的作用。如下图所示,各种加载读取文件。
不过这里我们需要注意init()会被调用两次,
第一次自然是在initialize()内部调用了,负责初始化应用 (就是application文件夹)
第二次就是在路由检测中调用,负责初始化模块(就是应用中的每个小模块,如图中的index模块)
这里我们可以配置phpStorm的Dbug,也可以使用debug_backtrace(); 这个函数进行监控
第一次调用 第二次调用2.initialize方法中应用调试模式( )
读取config/app.php文件中几项配置来决定是否开启关闭调试
ini_set()直接修改php.ini的内容
PHP_SAPI内置变量则获取php运行模式(cli:命令行模式,apache2handler:apache环境,cgi-fcgi:nginx)
ob_start()则是页面静态化
3.initialize方法中路由初始化:
routeInit()会读取route目录下的所有路由文件(scandir:列出目录中所有的文件和目录),因此只要是在route文件夹下的所有路由文件都会被include
下图引入了路由文件,并且判断路由文件的返回值,从而进行不同的处理(import方法后面再说,这里主要知道routeInit()的大致作用即可)
下图是路由文件,通过门面模式找到了facade/route类,并调用其get方法
打开官方手册,我们可以看到路由的定义如下
我们可以发现,无论是get() 还是 post() 还是 rule(),其本质都是调用 addRule()
那么addRule()又进行了哪些操作呢?欲知后事如何,请听下回分解