照猫画虎 实现 min-laravel 框架系列之服务提供者
- laravel
- 2020-06-04
- 232
- 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 方法