一種laravel特有的serviceProvider的加載方式


這里的laravel版本5.5。

我是使用到dingo這個包的時候,覺得很奇怪,我們一般的包使用的時候都需要加載一個serviceProvider,提供服務,dingo/api這里也有ServiceProvider,但是安裝的時候,並沒有讓我們修改config/app.php 增加寫入這個serviceProvider,這個是怎么做到的呢?

具體的追查過程就不說了

主要看Application.php的registerConfiguredProviders方法,里面有一行:

public function registerConfiguredProviders()
    {
        // 這里是讀取配置文件中app.provider中的服務
        $providers = Collection::make($this->config['app.providers'])
                        ->partition(function ($provider) {
                            return Str::startsWith($provider, 'Illuminate\\');
                        });
        // 這里是讀取bootstrap/cache/packages.php里面的信息,如果沒有這個文件,就去讀取每個包的composer.json里面的extra.laravel里面的providers,保存進入cache/services。
        $providers->splice(1, 0, [$this->make(PackageManifest::class)->providers()]);

        // 加載provider里面的各個Service
        (new ProviderRepository($this, new Filesystem, $this->getCachedServicesPath()))
                    ->load($providers->collapse()->toArray());
    }

換句話說,如果你這個包是希望用戶composer引入的時候就注冊ServiceProvider(而不是需要用戶手動增加),那么就可以在你自己這個包里面的composer.json增加類似的代碼:

"extra": {
        "laravel": {
            "providers": [
                "Dingo\\Api\\Provider\\LaravelServiceProvider"
            ],
            "aliases": {
                "API": "Dingo\\Api\\Facade\\API"
            }
        }
    },

這樣,你這個包的providers和alias就自動增加到項目里面去了。這個比以前每次安裝還需要在安裝文檔里面讓用戶修改配置可好得多了。

當然,這個是laravel特有的,如果你的包只是為laravel專門設計的,那么這個方式就完全可以用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM