中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Laravel5.5中包自動發現Package Auto Discovery的示例分析

發布時間:2021-09-10 09:25:55 來源:億速云 閱讀:136 作者:小新 欄目:開發技術

小編給大家分享一下Laravel5.5中包自動發現Package Auto Discovery的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

前言

在之前的 Laravel 版本中,安裝包通常需要幾個步驟,例如添加服務提供器到 app 配置文件并注冊相關的 facades。現在,從 Laravel 5.5 開始,Laravel 可以自動檢測并注冊服務提供器和 facades。

composer.json

一切的起源都是來自 composer.json ,在使用 composer 的時候,你可以在 post-autoload-dump 部分指定你想執行的腳本,比如在 Laravel 5.5 的時候,我們可以看到這樣的定義:

"scripts": { 
 "post-autoload-dump": [  
  "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",  
  "@php artisan package:discover"
 ]
}

對于 postAutoloadDump 是很熟悉了,Laravel 之前的版本基本都有,它的工作是清理一些緩存,刪除一些舊的文件。

我們的關注重點是@php artisan package:discover ,也就是會執行@php artisan package:discover 這個命令。

這個命令是干嘛的呢?它其實是位于Illuminate\Foundation\Console\PackageDiscoverCommand 中,主要是通過執行Illuminate\Foundation\PackageManifest 的 build() 方法來達到 發現 package 的目的。

而 PackageManifest 早就注冊在 Laravel 的 Container 中,那么它可以保證每次在啟動 Laravel 的時候都能使用 PackageManifest 的 build() 方法,這個 build() 方法主要的邏輯就是:

找尋 vendor/composer/installed.json 這個文件,這個文件是 composer 自己生成的,記錄著每一次的 composer autoload 的 class map。

而此時,Laravel 又將這些內容映射到 extra.laravel 的部分,比如:

"extra": { 
 "laravel": {  
  "providers": [   
  "Barryvdh\\Debugbar\\ServiceProvider"
  ],  
 "aliases": {   
  "Debugbar": "Barryvdh\\Debugbar\\Facade"
  }
 }
}

Laravel 首先將以上內容直接讀取下來放到一個 collection 中,然后在去檢查下面這個部分的定義,在決定是否需要執行 Package Discover 動作:

"extra": { 
 "laravel": {  
  "dont-discover": [   
  "barryvdh/laravel-debugbar"
  ]
 }
}

如果你不想執行 @php artisan package:discover 的發現效果,可以直接在 dont-discover 的數組里面填上 *。

這樣判斷完成之后,Laravel 將 collection 中需要發現的 Package 內容保存到一個緩存文件中bootstrap/cache/packages.php:

<?php return array (
 'barryvdh/laravel-debugbar' => array (
 'providers' => array (
  0 => 'Barryvdh\\Debugbar\\ServiceProvider',
 ),
 'aliases' => array (
  'Debugbar' => 'Barryvdh\\Debugbar\\Facade',
 ),
 ),
);

Laravel 怎么拿到 Package 信息?

這個時候,我們又需要看看 Laravel 項目啟動的時候,主要啟動下面的兩個服務:

  • \Illuminate\Foundation\Bootstrap\RegisterFacades

  • \Illuminate\Foundation\Bootstrap\RegisterProvider

而 上面的第一個服務會使用 Illuminate\Foundation\AliasLoader 加載所有的 alias ,在 AliasLoader 中:

// in RegisterFacades::bootstrap()

AliasLoader::getInstance(array_merge(
 $app->make('config')->get('app.aliases', []),
 $app->make(PackageManifest::class)->aliases()
))->register();

你可以看到,它首先讀取 app.php 的 aliases 數組,然后與 bootstrap/cache/packages.php 的 packages 數組合并,這個時候,就可以獲取到所有的 packages 信息進行發現和自帶加載了。這樣合并的好處就是,你還是可以直接在 app.php中定義你的 alias 來覆蓋自動發現的 package,從而保證你的項目還是可以運行得很流暢。

看完了這篇文章,相信你對“Laravel5.5中包自動發現Package Auto Discovery的示例分析”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

柳江县| 澜沧| 宁安市| 阜阳市| 赞皇县| 汉沽区| 玛多县| 蕉岭县| 英吉沙县| 吉安县| 普定县| 紫云| 荣昌县| 宁夏| 南投市| 泰来县| 垦利县| 吉首市| 南岸区| 盐源县| 长武县| 山丹县| 冷水江市| 永州市| 浑源县| 务川| 禹州市| 邹平县| 根河市| 奈曼旗| 科技| 本溪| 那坡县| 邯郸市| 南召县| 桐庐县| 安塞县| 乌兰浩特市| 凤冈县| 松桃| 乌兰察布市|