照猫画虎 实现 min-laravel 框架系列之服务提供者的注册和启动

php   laravel  

HTTP Kernel 服务提供者的注册和启动

注册

Illuminate\Foundation\Bootstrap\RegisterProviders;

  1. // 调用 application 类的 registerConfiguredProviders 方法
  2. public function bootstrap(Application $app)
  3. {
  4. $app->registerConfiguredProviders();
  5. }
  6. ....
  7. ....
  8. ** Illuminate\Foundation\Application;
  9. public function registerConfiguredProviders()
  10. {
  11. $providers = $this['config']->get('app.providers');
  12. (new ProviderRepository($this, new Filesystem, $this->getCachedServicesPath()))->load($providers);
  13. }

Filesystem 类

该类主要是负责生产缓存文件,有关文件操作的方法都在这个类中

ProviderRepository 类

load 方法

  1. public function load(array $providers)
  2. {
  3. // 加载缓存文件 @bootstrap/cache/services.php
  4. $manifest = $this->loadManifest();
  5. // 通过 $providers 判断是否需要重新生成缓存文件
  6. if ($this->shouldRecompile($manifest, $providers)) {
  7. $manifest = $this->compileManifest($providers);
  8. }
  9. // 处理条件加载问题,本质上是通过事件来处理的
  10. foreach ($manifest['when'] as $provider => $events) {
  11. $this->registerLoadEvents($provider, $events);
  12. }
  13. // 注册服务提供者,这类服务提供者每次请求都会进行注册
  14. foreach ($manifest['eager'] as $provider) {
  15. $this->app->register($provider);
  16. }
  17. // 延迟加载
  18. $this->app->addDeferredServices($manifest['deferred']);
  19. }

manifest 数据格式

缓存文件数据格式

启动

** Illuminate\Foundation\Application;

  1. public function boot()
  2. {
  3. if ($this->isBooted()) {
  4. return;
  5. }
  6. // 调用注册的回调函数
  7. $this->fireAppCallbacks($this->bootingCallbacks);
  8. array_walk($this->serviceProviders, function ($p) {
  9. $this->bootProvider($p);
  10. });
  11. $this->booted = true;
  12. $this->fireAppCallbacks($this->bootedCallbacks);
  13. }


评论 0

发表评论

Top