欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2018年01月04日 11:38:20   作者:子呆不呆  
這篇文章主要給大家介紹了關于Laravel Service Provider開發(fā)設置延遲加載時遇到的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起看看吧。

前言

本文主要介紹了關于Laravel Service Provider設置延遲加載時遇到的一些問題,之所有這篇文章,是因實際項目需求,近日在開發(fā) laravel-database-logger 包的時候,發(fā)現(xiàn)設置 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];
 }
}

當問題出現(xiàn)的時候就懷疑是因為設置了 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 內(nèi)容并load到 ProviderRepository 中。

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

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

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

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

php artisan clear-compiled 
php artisan optimize

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

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

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

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

總結

謹慎使用延遲加載 ServiceProvider

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

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

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

相關文章

  • php實現(xiàn)word轉html的方法

    php實現(xiàn)word轉html的方法

    這篇文章主要介紹了php實現(xiàn)word轉html的方法,涉及PHP調(diào)用com組件操作word文檔的相關技巧,需要的朋友可以參考下
    2016-01-01
  • PHP轉盤抽獎接口實例

    PHP轉盤抽獎接口實例

    這篇文章主要介紹了PHP轉盤抽獎接口的實現(xiàn)方法,實例分析了隨機抽獎接口的實現(xiàn)原理與對應數(shù)據(jù)庫操作的技巧,需要的朋友可以參考下
    2015-02-02
  • PHP的Trait機制原理與用法分析

    PHP的Trait機制原理與用法分析

    這篇文章主要介紹了PHP的Trait機制原理與用法,結合實例形式分析了PHP Trait機制的基本功能、原理及簡單使用技巧,需要的朋友可以參考下
    2019-10-10
  • php foreach如何跳出兩層循環(huán)(詳解)

    php foreach如何跳出兩層循環(huán)(詳解)

    下面小編就為大家?guī)硪黄猵hp foreach如何跳出兩層循環(huán)(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • 淺析PHP7的多進程及實例源碼

    淺析PHP7的多進程及實例源碼

    在本篇內(nèi)容里小編給大家分享了關于PHP7之多進程的相關概念和實例代碼知識點,需要的朋友們跟著學習下。
    2019-04-04
  • PHP7.1方括號數(shù)組符號多值復制及指定鍵值賦值用法分析

    PHP7.1方括號數(shù)組符號多值復制及指定鍵值賦值用法分析

    這篇文章主要介紹了PHP7.1方括號數(shù)組符號多值復制及指定鍵值賦值用法,結合實例形式對比分析了php7數(shù)組復制與賦值的新特性與操作技巧,需要的朋友可以參考下
    2016-09-09
  • PHP編程實現(xiàn)的TCP服務端和客戶端功能示例

    PHP編程實現(xiàn)的TCP服務端和客戶端功能示例

    這篇文章主要介紹了PHP編程實現(xiàn)的TCP服務端和客戶端功能,結合實例形式分析了php基于socket實現(xiàn)TCP服務器端與客戶端通信功能的相關配置、定義與使用技巧,需要的朋友可以參考下
    2018-04-04
  • php使用yield對性能提升的測試實例分析

    php使用yield對性能提升的測試實例分析

    這篇文章主要介紹了php使用yield對性能提升的測試,結合具體實例形式對比分析了php使用yield及常規(guī)操作的運算耗時與內(nèi)存占用情況,測試了yield對性能的提升大小,需要的朋友可以參考下
    2019-09-09
  • 深入解析php中的foreach問題

    深入解析php中的foreach問題

    本篇文章是對php中的foreach問題進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • php字符串操作針對負值的判斷分析

    php字符串操作針對負值的判斷分析

    這篇文章主要介紹了php字符串操作針對負值的判斷,實例分析了php字符串操作中針對負值的判斷技巧,需要的朋友可以參考下
    2016-07-07

最新評論