国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

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

2024-05-05 00:01:46
字體:
供稿:網(wǎng)友

前言

本文主要介紹了關(guān)于Laravel Service Provider設(shè)置延遲加載時(shí)遇到的一些問題,之所有這篇文章,是因?qū)嶋H項(xiàng)目需求,近日在開發(fā) laravel-database-logger 包的時(shí)候,發(fā)現(xiàn)設(shè)置 ServiceProvider defer 屬性設(shè)置為 true 時(shí),會導(dǎo)致在 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(); }); //當(dāng) $defer 設(shè)置為 true 時(shí),在路由中引用 databaselogger middleware 會報(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)問題出現(xiàn)的時(shí)候就懷疑是因?yàn)樵O(shè)置了 defer 屬性設(shè)置為 true 導(dǎo)致的,立刻就修改源碼把 protected $defer = true; 的代碼注釋掉,結(jié)果仍然是提示 databaselogger class not found. ,說明 Laravel 并沒有注冊此 ServiceProvder

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

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

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

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

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

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());

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

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

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

php artisan clear-compiled php artisan optimize

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

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

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

愿意很簡單,因?yàn)?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í)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到PHP教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 澄江县| 罗定市| 德令哈市| 祁阳县| 青海省| 辰溪县| 故城县| 吉首市| 天峨县| 舞钢市| 元氏县| 松江区| 道孚县| 虎林市| 开化县| 黄冈市| 南郑县| 丰宁| 清远市| 蓬莱市| 河北区| 德格县| 张家港市| 凤冈县| 隆尧县| 赤城县| 嘉定区| 石家庄市| 顺平县| 泉州市| 甘南县| 博爱县| 金溪县| 顺昌县| 巴马| 仙居县| 建水县| 龙岩市| 宿松县| 德化县| 冀州市|