laravel
laravel copied to clipboard
04. ServiceProvider Boot 解析
随着前面 《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 钩子