[laravel源码]Bootstrap\RegisterProviders.php
说明
本章说明RegisterProviders.php
所涉及的流程。
源码
vendor\laravel\framework\src\Illuminate\Foundation\Bootstrap\RegisterProviders.php
public function bootstrap(Application $app)
{
// 1. 注册所有配置的providers,依据config/app.php中的providers配置
$app->registerConfiguredProviders();
}
---
vendor\laravel\framework\src\Illuminate\Foundation\Application.php
public function registerConfiguredProviders()
{
// 1. 读取config/app文件,providers被分为两部分,框架及非框架
$providers = Collection::make($this->config['app.providers'])
->partition(function ($provider) {
return Str::startsWith($provider, 'Illuminate\\');
});
// 2. 加载依赖包注册的provider
$providers->splice(1, 0, [$this->make(PackageManifest::class)->providers()]);
// 3. 注册 service provider
(new ProviderRepository($this, new Filesystem, $this->getCachedServicesPath()))->load($providers->collapse()->toArray());
}
---
vendor\laravel\framework\src\Illuminate\Foundation\ProviderRepository.php
public function load(array $providers)
{
// 1. 加载vendor下的 service provider
$manifest = $this->loadManifest();
// 2. manifest 是否为空,空则编译
if ($this->shouldRecompile($manifest, $providers)) {
//编译流程见下方
$manifest = $this->compileManifest($providers);
}
// 3. 注册对应的事件监听器
foreach ($manifest['when'] as $provider => $events) {
$this->registerLoadEvents($provider, $events);
}
// 4. 注册serviceProvider
foreach ($manifest['eager'] as $provider) {
$this->app->register($provider);
}
// 5. 加入到延迟载入
$this->app->addDeferredServices($manifest['deferred']);
}
---
vendor\laravel\framework\src\Illuminate\Foundation\ProviderRepository.php
protected function compileManifest($providers)
{
// 1. 构建数组
$manifest = $this->freshManifest($providers);
foreach ($providers as $provider) {
// 2. 创建对象
$instance = $this->createProvider($provider);
// 3. 延迟加载则放入 deferred
if ($instance->isDeferred()) {
foreach ($instance->provides() as $service) {
$manifest['deferred'][$service] = $provider;
}
// 4. 获取相应的事件
$manifest['when'][$provider] = $instance->when();
}else {
// 5. eager 每次请求都需要载入
$manifest['eager'][] = $provider;
}
}
// 6. 更新cache/services.php文件
return $this->writeManifest($manifest);
}
分析
本作品采用《CC 协议》,转载必须注明作者和本文链接