最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

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();
 });
 //當(dāng) $defer 設(shè)置為 true 時(shí),在路由中引用 databaselogger middleware 會(huì)報(bào)錯(cuò),提示 databaselogger class not found.
 $this->app[\Illuminate\Routing\Router::class]->middleware('databaselogger', Middleware::class);

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

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

接下來(lái)就是想如何解決此問(wèn)題,嘗試了下面的方法:

1. 驗(yàn)證本身代碼是否存在問(wèn)題

在正常注冊(cè)的 AppServiceProvider 中注冊(cè)自己的 ServiceProvider

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

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

2. 研究源碼

在 config/app.php 中 providers 注冊(cè)無(wú)效,但是在其他 ServiceProvider 中注冊(cè)有效,說(shuō)明是其他問(wèn)題。

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

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

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

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

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

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

php artisan clear-compiled 
php artisan optimize

之后問(wèn)題就解決了,也更加深入理解了 ServiceProvider 的原理。

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

3. 為什么 AppServiceProvider 中注冊(cè)有效?

愿意很簡(jiǎn)單,因?yàn)?AppServiceProvider 并沒(méi)有延遲加載,因此在執(zhí)行 AppServiceProvider 中 register 方法去注冊(cè)新的 ServiceProvider 也是不會(huì)延遲加載的。

總結(jié)

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

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

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

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

相關(guān)文章

最新評(píng)論

潍坊市| 宁波市| 突泉县| 平湖市| 崇文区| 潼关县| 平武县| 岳西县| 扎鲁特旗| 五原县| 彭山县| 手机| 溧阳市| 韶山市| 固阳县| 鄱阳县| 东源县| 密云县| 永清县| 故城县| 新民市| 吉安市| 望谟县| 汉川市| 博白县| 丹凤县| 岐山县| 古田县| 南江县| 寻乌县| 尚义县| 广州市| 额尔古纳市| 年辖:市辖区| 怀安县| 枣阳市| 定远县| 镇安县| 会昌县| 中山市| 大田县|