激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

服務器之家 - 編程語言 - PHP教程 - 關于Laravel Service Provider開發設置延遲加載時遇到的問題詳解

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

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

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

前言

本文主要介紹了關于Laravel Service Provider設置延遲加載時遇到的一些問題,之所有這篇文章,是因實際項目需求,近日在開發 laravel-database-logger 包的時候,發現設置 ServiceProvider defer 屬性設置為 true 時,會導致在 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.  //當 $defer 設置為 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.  } 

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

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

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

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

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

注冊后結果一切正常。

2. 研究源碼

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

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

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

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

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

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

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

  1. php artisan clear-compiled  
  2. 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 。

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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 一级在线免费观看视频 | av之家在线观看 | 毛片一区二区三区四区 | 亚洲骚图 | 一级黄色免费观看 | 国产精品刺激对白麻豆99 | 亚洲欧美国产高清 | 中文字幕激情视频 | 亚洲网在线 | 久久嗨 | 日本人乱人乱亲乱色视频观看 | 日本精品久久久一区二区三区 | 欧美一级做一a做片性视频 日韩黄色片免费看 | 中国美女一级黄色大片 | 国产亚洲高清在线精品不卡 | 免费黄色大片在线观看 | 国产噜噜噜| 永久在线观看电影 | 亚a在线 | 色啪综合 | 国产日韩大片 | 亚洲综合视频网 | 好吊一区二区三区 | 国产资源视频在线观看 | 福利视频亚洲 | 国产又白又嫩又紧又爽18p | 久久精品欧美电影 | 羞羞的视频在线免费观看 | 成人做爰s片免费看网站 | 国产精品久久久乱弄 | 欧美精品成人一区二区在线观看 | av久草| 久久久久999| 日韩在线毛片 | 被玩坏了的女老师(高h np) | 欧美性猛交一区二区三区精品 | 国产一区二区三区高清 | 免费看性xxx高清视频自由 | 欧美日韩国产一区二区三区在线观看 | 日本在线不卡一区二区三区 | h视频在线免费观看 |