什麼是套件
於 Laravel 中的套件是為應用程式加入功能的 Composer 套件。套件大致分為兩類。- 獨立套件 — 不依賴 Laravel 的通用 PHP 函式庫(如 Carbon、Pest)
- Laravel 套件 — 具有路由、控制器、View、設定等,與 Laravel 整合功能的套件
若要撰寫套件的測試,可使用 Orchestra Testbench。可如同一般 Laravel 應用程式般撰寫套件的測試。
套件的自動偵測
Laravel 於套件安裝時,會讀取composer.json 的 extra.laravel 段落,自動註冊服務提供者與 Facade。
bootstrap/providers.php 即可自動載入套件。
關於自動偵測如何實作、快取何時被重建的詳細內容,請見套件自動偵測的內部結構。
停用自動偵測
若使用者端希望停用特定套件的自動偵測,可於應用程式的composer.json 設定。
服務提供者的角色
服務提供者是套件的進入點。將 View、設定、Migration、路由等資源註冊至 Laravel 的處理集中於此。 服務提供者繼承Illuminate\Support\ServiceProvider,具備 register 與 boot 兩個方法。
設定檔的 Publish
publishes() — 公開檔案
於boot 方法呼叫 publishes() 後,使用者即可透過 vendor:publish 指令將設定檔複製至自身應用程式。
mergeConfigFrom() — 與預設值合併
於register 方法使用 mergeConfigFrom(),即便使用者未公開設定檔,仍可使用套件的預設值。
以 tag 分公開群組
於publishes() 的第 2 個引數指定 tag,使用者可選擇僅公開所需資源。
路由的註冊
以loadRoutesFrom() 載入路由檔案。若應用程式的路由快取啟用,會自動略過。
Migration 的 Publish
使用publishesMigrations() 可公開 Migration 檔案。公開時 Laravel 會自動更新時間戳記。
View 的 Publish
loadViewsFrom() — 註冊 View
以loadViewsFrom() 註冊 View 目錄。透過第 2 個引數的命名空間,以 package::view 形式參照 View。
resources/views/vendor/courier 目錄,若無則使用套件的 View 目錄。如此使用者便可自訂 View。
公開 View
註冊 Blade 元件
若要將元件納入套件,於boot 方法註冊。
翻譯檔的 Publish
以loadTranslationsFrom() 註冊翻譯檔。翻譯以 package::file.key 形式參照。
loadJsonTranslationsFrom()。
指令的註冊
套件的 Artisan 指令以commands() 方法註冊。通常僅於 Console 環境註冊。
整合至 optimize 指令
若套件具備自身快取,可使用optimizes() 方法整合至 php artisan optimize 與 php artisan optimize:clear。
為 about 指令加入資訊
若要在 php artisan about 的輸出加入套件資訊,可使用 AboutCommand::add()。
Facade 的建立
使用 Facade 可將服務容器的綁定以靜態方法方式呼叫。1
建立服務類別
2
建立 Facade 類別
繼承
Illuminate\Support\Facades\Facade,於 getFacadeAccessor() 回傳服務容器的綁定 key。3
於服務提供者綁定
4
於 composer.json 註冊
@method annotation,IDE 補完便可啟用。
DeferrableProvider — 實作延遲載入
僅對服務容器進行綁定的提供者,可透過實作DeferrableProvider 介面實現延遲載入。因服務實際被需要之前提供者不會載入,可提升應用程式效能。
provides() 中列舉的服務被解析時提供者才會被載入。
套件的測試
若要單獨測試套件,可使用 Orchestra Testbench。可以彷彿身處於一般 Laravel 應用程式般撰寫套件測試。getPackageProviders() 註冊套件的服務提供者。
發布至 Composer
以下為將套件公開至 Packagist 的最佳實踐。composer.json 的基本設定
相關頁面
服務提供者
確認服務提供者的
register 與 boot 方法,以及延遲提供者的詳細內容。版本相容性管理
說明 Laravel 與 PHP 主版本升級的因應策略,以及 GitHub Actions 的測試矩陣設定。