Laravel Service Provider设置延迟加载后注册失败
Posted by: Tue Aug 27, 2019 | Word Count: 66   | Reading Time: 1 Minute  

问题

在参考网上示例,尝试创建service provider的时候,第一次尝试成功运行;然后修改其 $defer 属性为true再注释掉后,service provider始终无法加载成功。

定位&解决过程

  1. 验证新建的service provider本身是否有问题

    \App\Providers\AppServiceProvider 是系统默认会加载的,可以在其 register 函数中,链式加载新建的service provider

    public function register()
    {
        $this->app->register(ExampleServiceProvider::class);
    }
    

    试验后,发现程序正常运行,所以基本确认是注册在 config/app.php 中的 ExampleServiceProvider 没有生效。

  2. 研究service provider加载的源码

    通过 Illuminate\Foundation\Application 源码找到 registerConfiguredProviders 方法:

    (new ProviderRepository($this, new Filesystem, $this->getCachedServicesPath()))
                        ->load($providers->collapse()->toArray());
    

    Laravel是通过这个方法读取 config/app.php 中的 providers 内容并加载到 ProviderRepository 中。

    根据 $this->getCachedServicesPath() 可以看出,这里是有缓存的。

    Laravel会根据 bootstrap/cache/services.php 缓存文件的内容去加载service provider。

    程序员生涯两座大山:缓存 & 命名

解决方法

更改defer属性后,需要执行 php artisan clear-compiledphp artisan optimize 来更新service provider的缓存。

comments powered by Disqus