[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 协议》,转载必须注明作者和本文链接
城里的野山参
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
文章
68
粉丝
10
喜欢
29
收藏
41
排名:562
访问:1.4 万
私信
所有博文
社区赞助商