OctoberCMS系统分析之启动过程

2018-10-11 399

OctoberCMS启动过程基于Laravel请求生命周期,请求从index.php开始,创建app实例并绑定http请求对象,app加载定义的ServiceProvider服务提供器,http请求经过一系列的Middleware中间件处理,最终得到输出结果。OctoberCMS重写了Application、HttpKernel、Router三大核心类功能,并做了相应的扩展处理。

index.php

引入bootstrap/autoload.php和bootstrap/app.php文件

 

bootstrap/autoload.php

引入辅助函数库文件 vendor/october/rain/src/Support/helpers.php

引入第三方库自动加载文件 vendor/autoload.php

 

bootstrap/app.php

初始化全局app实例对象,new October\Rain\Foundation\Application

给app实例绑定HttpKernel(October\Rain\Foundation\Http\Kernel)、ConsoleKernel(October\Rain\Foundation\Console\Kernel)、ExceptionHandler(October\Rain\Foundation\Exception\Handler)

 

vendor/october/rain/src/Foundation/Application.php

October\Rain\Foundation\Application类,继承自Illuminate\Foundation\Application

1、重写bindPathsInContainer()方法

设置插件目录属性、主题目录属性、临时目录属性

注册绑定path.plugins、path.themes、path.temp到全局容器

2、重写registerBaseServiceProviders()方法

注册EventServiceProvider、LogServiceProvider、RoutingServiceProvider、MakerServiceProvider服务提供器

EventServiceProvider:绑定事件实例

LogServiceProvider:重写系统日志文件名

RoutingServiceProvider:绑定路由CoreRouter,重写dispatch方法,并增加router.before和router.after路由事件监听

MakerServiceProvider:绑定Maker容器对象解析类

3、重写registerCoreContainerAliases()方法

注册类别名,\October\Rain\Foundation\Application::class和\October\Rain\Database\DatabaseManager::class

4、getCachedXXXPath()方法

定义配置文件缓存路径方法、提高程序执行效率,生产环境才有效

5、setExecutionContext($context)方法

设置前后台上下文标识属性$executionContext

 

vendor/october/rain/src/Foundation/Http/Kernel.php

October\Rain\Foundation\Http\Kernel类,继承自Illuminate\Foundation\Http\Kernel

定义注册引导类$bootstrappers数组,通过bootstrap()方法传给app的bootstrapWith(array $bootstrappers)方法调用。

 

引导类说明:

\October\Rain\Foundation\Bootstrap\RegisterClassLoader

注册modules和plugins目录类文件自动加载

 

\October\Rain\Foundation\Bootstrap\LoadEnvironmentVariables

检测运行环境

 

\October\Rain\Foundation\Bootstrap\LoadConfiguration

初始化系统配置参数

 

\October\Rain\Foundation\Bootstrap\LoadTranslation

绑定多语言翻译类实例

 

\October\Rain\Foundation\Bootstrap\RegisterOctober

根据config配置信息设置插件和主题目录,根据URL设置前后台程序执行标识(front-end, back-end)

 

\Illuminate\Foundation\Bootstrap\RegisterProviders

根据config配置的providers数组注册ServiceProvider,其中包括注册ModuleServiceProvider(SystemServiceProvider、CmsServiceProvider、BackendServiceProvider)、PluginServiceProvider(Plugin)、ConsoleSupportServiceProvider

 

modules/system/ServiceProvider.php

该类继承自ServiceProvider,在register()方法实现了模块和插件的动态注册,同时初始化了控制台命令、错误处理、日志记录、Twig模板、邮件服务、标签函数、资源编译、数据验证、视图全局变量,以及后台的导航管理、报表组件、权限管理等。

 

vendor/october/rain/src/Router/CoreRouter.php

CoreRouter类继承自Illuminate\Routing\Router,重写了dispatch方法,并通过事件机制触发模块的App::before()方法注册模块和插件的路由,这样就可以访问模块和插件的控制器方法了。

 

本文只是大致的分析了一下OctoberCMS程序执行流程,没有对模块和插件实现流程进行详细分析,后续会有专门的文章对模块和插件深入分析和解刨,敬请期待。。。

发表评论