一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - 關(guān)于Laravel Service Provider開發(fā)設(shè)置延遲加載時遇到的問題詳解

關(guān)于Laravel Service Provider開發(fā)設(shè)置延遲加載時遇到的問題詳解

2019-10-26 16:12子呆不呆 PHP教程

這篇文章主要給大家介紹了關(guān)于Laravel Service Provider開發(fā)設(shè)置延遲加載時遇到的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起看看吧。

前言

本文主要介紹了關(guān)于Laravel Service Provider設(shè)置延遲加載時遇到的一些問題,之所有這篇文章,是因?qū)嶋H項目需求,近日在開發(fā) laravel-database-logger 包的時候,發(fā)現(xiàn)設(shè)置 ServiceProvider defer 屬性設(shè)置為 true 時,會導(dǎo)致在 register 方法中注冊的 middleware 無效。

  1. class ServiceProvider extends \Illuminate\Support\ServiceProvider 
  2.  protected $defer = true
  3.  public function register() 
  4.  { 
  5.  $this->mergeConfigFrom( 
  6.   __DIR__ . '/../config/config.php''ibrand.dblogger' 
  7.  ); 
  8.  $this->app->singleton(DbLogger::classfunction ($app) { 
  9.   return new DbLogger(); 
  10.  }); 
  11.  //當(dāng) $defer 設(shè)置為 true 時,在路由中引用 databaselogger middleware 會報錯,提示 databaselogger class not found. 
  12.  $this->app[\Illuminate\Routing\Router::class]->middleware('databaselogger', Middleware::class); 
  13.  
  14.  } 
  15.  public function provides() 
  16.  { 
  17.  return [DbLogger::class]; 
  18.  } 

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

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

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

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

  1. public function register() 
  2.  { 
  3.  // 
  4.  $this->app->register(\Ibrand\DatabaseLogger\ServiceProvider::class); 
  5.  } 

注冊后結(jié)果一切正常。

2. 研究源碼

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

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

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

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

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

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

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

  1. php artisan clear-compiled  
  2. php artisan optimize 

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

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

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

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

總結(jié)

謹(jǐn)慎使用延遲加載 ServiceProvider

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

嚴(yán)禁在延遲加載的 ServiceProvider 注冊 middleware 和 route 。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對服務(wù)器之家的支持。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: www.日本在线播放 | 800精品国产导航 | 激情视频亚洲 | 人体做爰aaaa免费 | 耽美调教高h | 国产精品探花一区在线观看 | 俄罗斯年轻男同gay69 | 免费一级黄 | www日本高清视频 | wankz视频| 国产欧美一区二区精品性色99 | 操美女骚b| 国产成人综合亚洲一区 | 超级碰碰青草免费视频92 | 久久全国免费久久青青小草 | 国内精品 大秀视频 日韩精品 | 国产视频一区在线观看 | 欧美在线一 | 奇米影视一区 | 国产一级在线免费观看 | 人人揉揉香蕉 | 韩国美女被的免费视频 | 肉大捧一进一出视频免费播放 | 免费片在线观看 | 大乳孕妇一级毛片 | 美女视频在线观看视频 | 午夜家庭影院 | 国产麻豆剧果冻传媒观看免费视频 | 欧美高清无砖专区欧美精品 | 啊啊啊好大视频 | 国产精品永久免费视频 | 久久re这里精品在线视频7 | 免费网站看v片在线成人国产系列 | 亚洲精品第二页 | 国产精品久久久久久福利 | 香蕉久久综合 | 久久国产精品无码视欧美 | 日韩欧美视频二区 | 日本伦理动漫在线观看 | 加勒比成人 | 国产精品久久久久一区二区三区 |