照猫画虎 实现 min-laravel 框架系列之服务提供者

php   laravel  

服务提供者

按照 laravel 社区文档的翻译:服务提供者是所有 Laravel 应用程序的引导中心。你的应用程序,以及 通过服务器引导的 Laravel 核心服务都是通过服务提供器引导。

服务提供者是 laravel 框架的另一个比较重要的概念,系统的事件系统、路由系统等都是通过服务提供者的方式进行的

主要方法

Application::register 方法

  1. public function register($provider, $force = false)
  2. {
  3. // 已经注册过,并且没有需要重新注册
  4. if ( ($registered = $this->getProvider($provider)) && ! $force) {
  5. return $registered;
  6. }
  7. // 如果参数是字符串,
  8. if (is_string($provider)) {
  9. $provider = $this->resolveProvider($provider);
  10. }
  11. // 调用服务提供者的 register 方法
  12. $provider->register();
  13. // 根据属性设置,在服务容器中进行绑定一下实现关系
  14. if (property_exists($provider, 'bindings')) {
  15. foreach ($provider->bindings as $key => $value) {
  16. $this->bind($key, $value);
  17. }
  18. }
  19. if (property_exists($provider, 'singletons')) {
  20. foreach ($provider->singletons as $key => $value) {
  21. $this->singleton($key, $value);
  22. }
  23. }
  24. $this->markAsRegistered($provider);
  25. // 如果系统启动了,就需要调用服务提供者的 boot 方法,
  26. if ($this->isBooted()) {
  27. $this->bootProvider($provider);
  28. }
  29. return $provider;
  30. }

Application::markAsRegistered 方法

这个方法就是在 application 中保存记录

  1. protected function markAsRegistered($provider)
  2. {
  3. $this->serviceProviders[] = $provider;
  4. $this->loadedProviders[get_class($provider)] = true;
  5. }

Application::bootProvider 方法

当 laravel 所有引导程序完成之后,会调用这个方法,该方法去调用服务提供者中的 boot 方法,这样就可以是系统有更多的灵活性

  1. protected function bootProvider(ServiceProvider $provider)
  2. {
  3. if (method_exists($provider, 'boot')) {
  4. return $this->call([$provider, 'boot']);
  5. }
  6. }

Application::call 方法

这个方法本身只是调用闭包或者类方法,但是,为了给系统提供解决参数依赖的问题,这块还是比较复杂的部分

测试

在 min-laravel 路径下,按照 laravel 框架的目录,建立如下所示的服务提供者目录

服务提供者

并且修改 public/index.php 文件,加上注册

  1. // 服务容器
  2. $app->register( new \App\Providers\TestServiceProvider( $app ) );

因为我们还没有做框架引导(boot),所以还不会自动调用提供者的 boot 方法



评论 0

发表评论

Top