照猫画虎 实现 min-laravel 框架系列之服务提供者
- laravel
- 2020-06-04
- 4098
- 0
服务提供者
按照 laravel 社区文档的翻译:服务提供者是所有 Laravel 应用程序的引导中心。你的应用程序,以及 通过服务器引导的 Laravel 核心服务都是通过服务提供器引导。
服务提供者是 laravel 框架的另一个比较重要的概念,系统的事件系统、路由系统等都是通过服务提供者的方式进行的
主要方法
Application::register 方法
public function register($provider, $force = false)
{
// 已经注册过,并且没有需要重新注册
if ( ($registered = $this->getProvider($provider)) && ! $force) {
return $registered;
}
// 如果参数是字符串,
if (is_string($provider)) {
$provider = $this->resolveProvider($provider);
}
// 调用服务提供者的 register 方法
$provider->register();
// 根据属性设置,在服务容器中进行绑定一下实现关系
if (property_exists($provider, 'bindings')) {
foreach ($provider->bindings as $key => $value) {
$this->bind($key, $value);
}
}
if (property_exists($provider, 'singletons')) {
foreach ($provider->singletons as $key => $value) {
$this->singleton($key, $value);
}
}
$this->markAsRegistered($provider);
// 如果系统启动了,就需要调用服务提供者的 boot 方法,
if ($this->isBooted()) {
$this->bootProvider($provider);
}
return $provider;
}
Application::markAsRegistered 方法
这个方法就是在 application 中保存记录
protected function markAsRegistered($provider)
{
$this->serviceProviders[] = $provider;
$this->loadedProviders[get_class($provider)] = true;
}
Application::bootProvider 方法
当 laravel 所有引导程序完成之后,会调用这个方法,该方法去调用服务提供者中的 boot 方法,这样就可以是系统有更多的灵活性
protected function bootProvider(ServiceProvider $provider)
{
if (method_exists($provider, 'boot')) {
return $this->call([$provider, 'boot']);
}
}
Application::call 方法
这个方法本身只是调用闭包或者类方法,但是,为了给系统提供解决参数依赖的问题,这块还是比较复杂的部分
测试
在 min-laravel 路径下,按照 laravel 框架的目录,建立如下所示的服务提供者目录
并且修改 public/index.php 文件,加上注册
// 服务容器
$app->register( new \App\Providers\TestServiceProvider( $app ) );
因为我们还没有做框架引导(boot),所以还不会自动调用提供者的 boot 方法