laravel启动流程
laravel启动流程
- nginx/apache路由到public/index.php文件
- 加载/vendor/autoload.php composer包管理器文件
- $app = require_once DIR.'/../bootstrap/app.php'; 得到ioc容器
- 实例化Illuminate\Foundation\Application 运行构造函数
- setBasePath 绑定路径变量
- registerBaseBindings 注册基础绑定到容器(初始化容器)
- registerBaseServiceProviders 注册基础服务到容器(事件,日志,路由服务)
- registerCoreContainerAliases 核心容器设置别名
- Illuminate\Foundation\Application->singleton() 将App\Http\Kernel,App\Console\Kernel,App\Exceptions\Handler三个核心类注册到容器(此处需要了解bind方法)
- 实例化Illuminate\Foundation\Application 运行构造函数
- $kernel = $app->make(Illuminate\Contracts\Http\Kernel:Class); $kernel为Illuminate\Foundation\Http\Kernel 实例化对象
- 从binding的数组里面找出Illuminate\Contracts\Http\Kernel:Class绑定的信息(闭包定义的是接口和实现类调用build方法)
- 从容器中获取Illuminate\Contracts\Http\Kernel:Class注册的闭包
- build方法执行闭包,闭包里调用build方法,然后通过反射加递归的方式获取Illuminate\Contracts\Http\Kernel:Class的实例化对象,bindings属性包含注册的绑定关系,instances属性包含已实例化对象
- $kernel->handle($request = Request::capture())
- $request = Request::capture() 将http请求的信息存到requset对象
- $kernel->bootstrap();启动服务,分别执行以下几个类的bootstrap方法
- LoadEnvironmentVariables 加载环境变量
- LoadConfiguration 加载配置文件,将配置文件赋值到对应环境变量上
- HandleExceptions 异常处理
- RegisterFacades 注册外观类,spl_autoload_register()将外观类注册到栈顶,app.aliases设置的外观类:(eg:执行Router:get(),找不到的类通过sql_autoload_register注册找到Facade.php 触发魔术方法__callStatic获取到app.aliases的Route对应的Illuminate\Support\Facades\Route::class路由外观类,路由外观类会获取关键字route,从容器中获取router实例化对象)
- RegisterProviders 注册app.providers所有的服务类,将所有非延迟加载的服务类注册
- BootProviders 执行serviceProvice的boot方法
- (new Pipeline($this->app))->send($request)->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)->then($this->dispatchToRouter());请求通过中间件

浙公网安备 33010602011771号