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