设为首页 加入收藏

TOP

laravel5.5源码笔记(二、服务提供者provider)(二)
2019-08-23 00:33:51 】 浏览:72
Tags:laravel5.5 源码 笔记 服务 提供者 provider
Providers::class, 18 ];

这几个文件的内容都很简单,并且都是调用了application中的方法

 1     public function bootstrapWith(array $bootstrappers)
 2     {
 3         $this->hasBeenBootstrapped = true;
 4 
 5         foreach ($bootstrappers as $bootstrapper) {
 6             $this['events']->fire('bootstrapping: '.$bootstrapper, [$this]);
 7             //make了刚刚传入的$bootstrappers数组,并执行了其中的bootstrap方法,暂且只看provider
 8             $this->make($bootstrapper)->bootstrap($this);
 9 
10             $this['events']->fire('bootstrapped: '.$bootstrapper, [$this]);
11         }
12     }
13     
14     //Illuminate\Foundation\Bootstrap\RegisterProviders.php
15     public function bootstrap(Application $app)
16     {
17         $app->registerConfiguredProviders();
18     }
19 
20     //Illuminate\Foundation\Bootstrap\BootProviders.php
21     public function bootstrap(Application $app)
22     {
23         $app->boot();
24     }

这里绕了一大圈,最终还是回到了application文件中,还记得上一篇博文中介绍的registerConfiguredProviders方法吗?

application的registerConfiguredProviders()方法对服务提供者进行了注册,通过框架的文件系统收集了配置文件中的各种provicers并转化成数组,在G:\wamp64\www\test\laravel55\vendor\laravel\framework\src\Illuminate\Foundation\ProviderRepository.php类的load方法中进行加载,但最终还是会在application类中的register()方法中通过字符串的方式new出对象,在执行provider中自带的register()方法

 1     public function registerConfiguredProviders()
 2     {
 3         //laravel的集合类,将之前初始化时存入的config中的数组取出
 4         $providers = Collection::make($this->config['app.providers'])
 5                         ->partition(function ($provider) {
 6                             //并过滤出系统providers
 7                             return Str::startsWith($provider, 'Illuminate\\');
 8                         });
 9         //之前在registerBaseBindings方法中绑定在PackageManifest类中的providers数组拼接,通过load方法加载它们
10         $providers->splice(1, 0, [$this->make(PackageManifest::class)->providers()]);
11         //new了provider库,传入服务容器、文件系统操作对象、与之前缓存的服务提供者路径
12         (new ProviderRepository($this, new Filesystem, $this->getCachedServicesPath()))
13                     ->load($providers->collapse()->toArray());
14     }
 1  //Illuminate\Foundation\ProviderRepository.php
 2 
 3    public function load(array $providers)
 4     {
 5         // 查看bootstrap/cache/services.php有没有这个缓存文件
 6         // 第一次启动时是没有的
 7         $manifest = $this->loadManifest();
 8         // 开始没有这个缓存文件,那就把$providers[ ]里的值
 9         if ($this->shouldRecompile($manifest, $providers)) {
10             // 然后根据$providers[ ]编译出services.php这个缓存文件
11             $manifest = $this->compileManifest($providers);
12         }
13 
14         foreach ($manifest['when'] as $provider => $events) {
15             // 注册包含有事件监听的service provider
16             // 包含有事件监听的service provider都要有when()函数返回
17             $this->registerLoadEvents($provider, $events);
18         }
19 
20         foreach ($manifest['eager'] as $provider) {
21             // 把'eager'字段中service provider注册进容器中,
22             // 即遍历每一个service provider,调用其中的register()方法
23             // 向容器中注册具体的服务
24             $this->app->register($this->createProvider($provider));
25         }
26 
27         // 注册延迟的service provider,
28         // deferred的service provider, 一是要设置$defer = true,二是要提供provides()方法返回绑定到容器中服务的名称
29         $this->app->addDeferredServices($manifest['deferred']);
30     }

 

而boot操作就更简单了

 1     public function boot()
 2     {
 3         if ($this->booted) {
 4             return;
 5         }
 6 
 7         // Once the application has booted we will also fire some "booted" callbacks
 8         // for any listeners that need to do work after this initial booting gets
 9         // finished. This is useful when ordering the boot-up processes we
首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇PHP标记 下一篇Linux系统下搭建MantisBT环境以及..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目