PS:学习笔记
先对ThinkPHP5的应用执行流程做一下大致介绍:整个流程大概分为六个部分
1.入口文件和引导文件
用户发起的请求都会经过应用的入口文件,通常是public/index.php文件,一般入口文件以定义一些常量为主,还包含了引导文件start.php.
start.php文件又会首先调用base.php基础引导文件,然后执行应用并且输出...
base.php文件主要包含:
●定义了一些系统常量
●包含了Loader.php类文件
●加载了环境变量定义文件
●注册自动加载
●注册错误和异常处理机制
●加载惯例配置文件
2.注册自动加载和错误处理机制
系统会调用Loader::register()方法注册自动加载
自动加载主要由下面这些部分组成:
●注册系统的自动加载方法\think\Loader::autoload
●注册命名空间定义,加载类库映射文件
●Composer自动加载支持
●注册extend扩展目录
执行Error::register()注册错误和异常处理机制
由三部分组成:
●错误处理方法:think\Error::appError
●异常处理方法:think\Error::appException
●应用关闭方法:think\Error::appShutdown
3.应用初始化
初始化主要包括:
●加载应用(公共)配置
●加载扩展配置文件(由extra_config_list定义)
●加载应用状态配置
●加载行为定义
●加载公共(函数)文件
●注册应用命名空间
●加载扩展函数文件(由extra_file_list定义)
●设置默认时区
●加载系统语言包
4.路由检测
如果开启了url_route_on参数的话,会首先进行URL的路由检测。
如果一旦检测到匹配的路由,根据定义的路由地址会注册到相应的URL调度。
如果关闭路由或者路由检测无效,则进行默认的模块/控制器/操作的解析
5.分发请求
路由器会分发请求到对应的路由地址,在这里还可以完成应用的业务逻辑及数据返回。
下面是系统支持的分发请求机制,可以根据情况选择:
●模块/控制器/操作
这是默认的分发请求机制,系统会根据URL或者路由地址来判断当前请求的模块、控制器和操作名,并自动调用相应的访问控制器类,执行操作对应的方法。
●控制器方法
和前一种方式类似,只是无需判断模块、控制器和操作,直接分发请求到一个指定的控制器类的方法,因此没有进行模块的初始化操作。
●外部重定向
可以直接分发请求到一个外部的重定向地址,支持指定重定向代码,默认为301重定向。
●闭包函数
路由地址定义的时候可以直接采用闭包函数,完成一些相对简单的逻辑操作和输出。
6.响应输出和应用结束
控制器的所有操作方法都是return返回而不是直接输出,系统会调用Response::send方法将最终的应用返回的数据输出到页面或者客户端。
事实上,在应用的数据响应输出之后,应用并没有真正的结束,系统会在应用输出或者中断后进行日志保存写入操作。