婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 關于Laravel Service Provider開發設置延遲加載時遇到的問題詳解

關于Laravel Service Provider開發設置延遲加載時遇到的問題詳解

熱門標簽:南寧高頻外呼回撥系統哪家好 離石地圖標注 電話機器人危險嗎 江蘇外呼電銷機器人報價 400電話申請方法收費 長沙crm外呼系統業務 400電話辦理福州市 深圳外呼系統收費 專業電話機器人批發商

前言

本文主要介紹了關于Laravel Service Provider設置延遲加載時遇到的一些問題,之所有這篇文章,是因實際項目需求,近日在開發 laravel-database-logger 包的時候,發現設置 ServiceProvider defer 屬性設置為 true 時,會導致在 register 方法中注冊的 middleware 無效。

class ServiceProvider extends \Illuminate\Support\ServiceProvider
{
 protected $defer = true; 
 public function register()
 {
 $this->mergeConfigFrom(
  __DIR__ . '/../config/config.php', 'ibrand.dblogger'
 );
 $this->app->singleton(DbLogger::class, function ($app) {
  return new DbLogger();
 });
 //當 $defer 設置為 true 時,在路由中引用 databaselogger middleware 會報錯,提示 databaselogger class not found.
 $this->app[\Illuminate\Routing\Router::class]->middleware('databaselogger', Middleware::class);

 } 
 public function provides()
 {
 return [DbLogger::class];
 }
}

當問題出現的時候就懷疑是因為設置了 defer 屬性設置為 true 導致的,立刻就修改源碼把 protected $defer = true; 的代碼注釋掉,結果仍然是提示 databaselogger class not found. ,說明 Laravel 并沒有注冊此 ServiceProvder

接下來就是想如何解決此問題,嘗試了下面的方法:

1. 驗證本身代碼是否存在問題

在正常注冊的 AppServiceProvider 中注冊自己的 ServiceProvider

public function register()
 {
 //
 $this->app->register(\Ibrand\DatabaseLogger\ServiceProvider::class);
 }

注冊后結果一切正常。

2. 研究源碼

在 config/app.php 中 providers 注冊無效,但是在其他 ServiceProvider 中注冊有效,說明是其他問題。

通過研究 Illuminate\Foundation\Application 源碼找到 registerConfiguredProviders 方法:

Laravel 是在此方法中去讀取 config/app.php 中的 providers 內容并load到 ProviderRepository 中。

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

重點在 $this->getCachedServicesPath()  ,通過源碼發現 Laravel 是根據 bootstrap/cache/services.php 文件去決定如何注冊 ServiceProvider。

此時想到了為什么之前注釋了 //protected $defer = true; 代碼后仍然無效的原因。

所以為了讓注釋后的 //protected $defer = true; 代碼有效需要執行

php artisan clear-compiled 
php artisan optimize

之后問題就解決了,也更加深入理解了 ServiceProvider 的原理。

所以切記:如果準備采用延遲加載ServiceProvider時,嚴禁進行注冊 middleware, route 等系列操作。同時,更改 defer 屬性值后,需要執行 php artisan clear-compiled php artisan optimize 以更新 ServiceProvider 緩存。

3. 為什么 AppServiceProvider 中注冊有效?

愿意很簡單,因為 AppServiceProvider 并沒有延遲加載,因此在執行 AppServiceProvider 中 register 方法去注冊新的 ServiceProvider 也是不會延遲加載的。

總結

謹慎使用延遲加載 ServiceProvider

更改 defer 屬性值后,需要執行 php artisan clear-compiled php artisan optimize 以更新 ServiceProvider 緩存。

嚴禁在延遲加載的 ServiceProvider 注冊 middleware 和 route 。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • laravel5創建service provider和facade的方法詳解

標簽:白酒營銷 興安盟 濱州 株洲 南昌 太原 曲靖 南京

巨人網絡通訊聲明:本文標題《關于Laravel Service Provider開發設置延遲加載時遇到的問題詳解》,本文關鍵詞  關于,Laravel,Service,Provider,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《關于Laravel Service Provider開發設置延遲加載時遇到的問題詳解》相關的同類信息!
  • 本頁收集關于關于Laravel Service Provider開發設置延遲加載時遇到的問題詳解的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 松江区| 余庆县| 鲜城| 濉溪县| 佳木斯市| 宣恩县| 和静县| 曲阜市| 灯塔市| 多伦县| 麦盖提县| 平顶山市| 南宫市| 楚雄市| 临潭县| 忻城县| 阳东县| 临夏市| 左云县| 淄博市| 来宾市| 文成县| 阿巴嘎旗| 商都县| 孟连| 梅河口市| 赣州市| 嘉定区| 湖口县| 汉川市| 南雄市| 长寿区| 乐至县| 连江县| 盘山县| 江山市| 垫江县| 华安县| 临清市| 额尔古纳市| 墨江|