您好,登錄后才能下訂單哦!
小編給大家分享一下Laravel5.5中包自動(dòng)發(fā)現(xiàn)Package Auto Discovery的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
前言
在之前的 Laravel 版本中,安裝包通常需要幾個(gè)步驟,例如添加服務(wù)提供器到 app 配置文件并注冊(cè)相關(guān)的 facades。現(xiàn)在,從 Laravel 5.5 開(kāi)始,Laravel 可以自動(dòng)檢測(cè)并注冊(cè)服務(wù)提供器和 facades。
composer.json
一切的起源都是來(lái)自 composer.json ,在使用 composer 的時(shí)候,你可以在 post-autoload-dump 部分指定你想執(zhí)行的腳本,比如在 Laravel 5.5 的時(shí)候,我們可以看到這樣的定義:
"scripts": { "post-autoload-dump": [ "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", "@php artisan package:discover" ] }
對(duì)于 postAutoloadDump 是很熟悉了,Laravel 之前的版本基本都有,它的工作是清理一些緩存,刪除一些舊的文件。
我們的關(guān)注重點(diǎn)是@php artisan package:discover
,也就是會(huì)執(zhí)行@php artisan package:discover
這個(gè)命令。
這個(gè)命令是干嘛的呢?它其實(shí)是位于Illuminate\Foundation\Console\PackageDiscoverCommand 中,主要是通過(guò)執(zhí)行Illuminate\Foundation\PackageManifest 的 build()
方法來(lái)達(dá)到 發(fā)現(xiàn) package 的目的。
而 PackageManifest 早就注冊(cè)在 Laravel 的 Container 中,那么它可以保證每次在啟動(dòng) Laravel 的時(shí)候都能使用 PackageManifest 的 build()
方法,這個(gè) build()
方法主要的邏輯就是:
找尋 vendor/composer/installed.json 這個(gè)文件,這個(gè)文件是 composer 自己生成的,記錄著每一次的 composer autoload 的 class map。
而此時(shí),Laravel 又將這些內(nèi)容映射到 extra.laravel 的部分,比如:
"extra": { "laravel": { "providers": [ "Barryvdh\\Debugbar\\ServiceProvider" ], "aliases": { "Debugbar": "Barryvdh\\Debugbar\\Facade" } } }
Laravel 首先將以上內(nèi)容直接讀取下來(lái)放到一個(gè) collection 中,然后在去檢查下面這個(gè)部分的定義,在決定是否需要執(zhí)行 Package Discover 動(dòng)作:
"extra": { "laravel": { "dont-discover": [ "barryvdh/laravel-debugbar" ] } }
如果你不想執(zhí)行 @php artisan package:discover
的發(fā)現(xiàn)效果,可以直接在 dont-discover 的數(shù)組里面填上 *。
這樣判斷完成之后,Laravel 將 collection 中需要發(fā)現(xiàn)的 Package 內(nèi)容保存到一個(gè)緩存文件中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 信息?
這個(gè)時(shí)候,我們又需要看看 Laravel 項(xiàng)目啟動(dòng)的時(shí)候,主要啟動(dòng)下面的兩個(gè)服務(wù):
\Illuminate\Foundation\Bootstrap\RegisterFacades
\Illuminate\Foundation\Bootstrap\RegisterProvider
而 上面的第一個(gè)服務(wù)會(huì)使用 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 數(shù)組,然后與 bootstrap/cache/packages.php 的 packages 數(shù)組合并,這個(gè)時(shí)候,就可以獲取到所有的 packages 信息進(jìn)行發(fā)現(xiàn)和自帶加載了。這樣合并的好處就是,你還是可以直接在 app.php中定義你的 alias 來(lái)覆蓋自動(dòng)發(fā)現(xiàn)的 package,從而保證你的項(xiàng)目還是可以運(yùn)行得很流暢。
看完了這篇文章,相信你對(duì)“Laravel5.5中包自動(dòng)發(fā)現(xiàn)Package Auto Discovery的示例分析”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。