xiaohuilam / laravel

Laravel 深入详解 —— 源代码解析,新手进阶指南
433 stars 80 forks source link

04. ServiceProvider Boot 解析 #4

Open xiaohuilam opened 5 years ago

xiaohuilam commented 5 years ago

随着前面 《02. Kernel Handle解析》 和 《03. ServiceProvider Register 解析》 的结束,我们接下来要分析的便是 启动服务提供者 这个步骤。

代码

https://github.com/xiaohuilam/laravel/blob/d081c918b7e582ec5b3f94316f44834466cec37d/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/BootProviders.php#L1-L19

ServiceProvider Register 一样的,在 BootProviders 中也是调用了 Illuminate\Foundation\Application::boot() https://github.com/xiaohuilam/laravel/blob/d081c918b7e582ec5b3f94316f44834466cec37d/vendor/laravel/framework/src/Illuminate/Foundation/Application.php#L759-L782

首先判断是否 boot 过。

然后通过触发 $bootingCallbacks 钩子 https://github.com/xiaohuilam/laravel/blob/d081c918b7e582ec5b3f94316f44834466cec37d/vendor/laravel/framework/src/Illuminate/Foundation/Application.php#L823-L834

$bootingCallbacks 是来自 02. HTTP Kernel Handle解析 登记的闭包,主要是服务于声明了 $defer = true 的服务提供者。

然后依次遍历 $this->serviceProviders 执行 Illuminate\Foundation\Application::bootProvider() https://github.com/xiaohuilam/laravel/blob/d081c918b7e582ec5b3f94316f44834466cec37d/vendor/laravel/framework/src/Illuminate/Foundation/Application.php#L784-L795

其实就是运行一遍 ServiceProvider 的 boot 方法

接着将 Illuminate\Foundation\Application::$boot 设置为 true

最后触发 bootedCallbacks 钩子