服务提供者,其实就是用来完成服务绑定的独立功能类,
绑定的时机:
一部分,就是在应用服务容器初始化时($app实例化),完成基础的服务绑定,参考代码:
文件 Illuminate\Foundation\Application __construct()
// 注册基础服务提供者
$this->registerBaseServiceProviders();
protected function registerBaseServiceProviders()
{
$this->register(new EventServiceProvider($this));
$this->register(new LogServiceProvider($this));
$this->register(new RoutingServiceProvider($this));
}
另一部分,是在内核 Kernel 处理请求前,会绑定一些基础功能服务提供者。
1. $kernel->handle
2. $this->sendRequestThroughRouter($request);
3. $this->bootstrap();
4. $this->app->bootstrapWith($this->bootstrappers());
protected $bootstrappers = [
\Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables::class,
\Illuminate\Foundation\Bootstrap\LoadConfiguration::class,
\Illuminate\Foundation\Bootstrap\HandleExceptions::class,
\Illuminate\Foundation\Bootstrap\RegisterFacades::class,
// 先启动注册服务提供者,触发服务提供者的register()方法
\Illuminate\Foundation\Bootstrap\RegisterProviders::class,
// 注册完毕后,在启动boot服务提供者,触发全部服务提供者的boot()方法
\Illuminate\Foundation\Bootstrap\BootProviders::class,
];
5. $app->registerConfiguredProviders();
public function registerConfiguredProviders()
{
//加载config/app.php的providers和defaultProviders,并将框架的providers排在数组前面
$providers = Collection::make($this->make('config')->get('app.providers'))
->partition(fn ($provider) => str_starts_with($provider, 'Illuminate\\'));
//将bootstrap/cache/packages.php中的providers插入到$providers中间。
$providers->splice(1, 0, [$this->make(PackageManifest::class)->providers()]);
//注册$providers中的eager,并将$manifest写入bootstrap/cache/services.php
(new ProviderRepository($this, new Filesystem, $this->getCachedServicesPath()))
->load($providers->collapse()->toArray());
}
任何服务提供者的 boot () 方法都会在全部服务提供者注册之后运行。那也就可以保证在 boot () 方法中,可以使用全部的注册服务。
protected $defer = true; //延迟绑定