什麼是套件
於 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 兩個方法。
callAfterResolving() 的執行時機,以及能承受重複套用的設計。
若要了解在 Octane 或佇列 worker 中也不會延續狀態的註冊方式,請參閱套件服務的生命週期設計。該頁面解說了 scoped() 的內部實作,以及 singleton 所持有相依性的注意事項。
設定檔的 Publish
publishes() — 公開檔案
於boot 方法呼叫 publishes() 後,使用者即可透過 vendor:publish 指令將設定檔複製至自身應用程式。
mergeConfigFrom() — 與預設值合併
於register 方法使用 mergeConfigFrom(),即便使用者未公開設定檔,仍可使用套件的預設值。
以 tag 分公開群組
於publishes() 的第 2 個引數指定 tag,使用者可選擇僅公開所需資源。
路由的註冊
以loadRoutesFrom() 載入路由檔案。若應用程式的路由快取啟用,會自動略過。
Migration 的 Publish
使用publishesMigrations() 可將 Migration 檔案註冊為公開對象。在 Laravel 13 的預設設定中,database.migrations.update_date_on_publish 為啟用狀態,因此公開時會更新檔名中的時間戳記。若該設定停用或不存在,則不會進行此更新。
View 的 Publish
loadViewsFrom() — 註冊 View
以loadViewsFrom() 註冊 View 目錄。透過第 2 個引數的命名空間,以 package::view 形式參照 View。
resources/views/vendor/courier 目錄,若無則使用套件的 View 目錄。如此使用者便可自訂 View。
實作上的搜尋順序與以檔案為單位的退回機制、如何將變更交付至已公開的範本,以及與 Blade 快取的差異,請參閱套件 View 的覆寫與更新。
公開 View
註冊 Blade 元件
若要將元件納入套件,於boot 方法註冊。
公開資源的發布
若要發布套件的 JavaScript、CSS 與圖片,請以publishes() 註冊複製到 public_path('vendor/courier') 等位置。即使更新套件,已公開的檔案也不會自動改變。
依 tag 與提供者篩選對象、--force 與 --existing 的差異、已刪除檔案的處理,以及透過 laravel-assets 的更新,請參閱套件的公開資源與更新。
翻譯檔的 Publish
以loadTranslationsFrom() 註冊翻譯檔。翻譯以 package::file.key 形式參照。
loadJsonTranslationsFrom()。
指令的註冊
套件的 Artisan 指令以commands() 方法註冊。通常僅於 Console 環境註冊。
整合至 optimize 指令
若套件具備自身快取,可使用optimizes() 方法整合至 php artisan optimize 與 php artisan optimize:clear。
--except 排除、與標準任務的執行順序,以及失敗時的結束代碼,請參閱套件快取與 optimize 的整合。
為 about 指令加入資訊
若要在 php artisan about 的輸出加入套件資訊,可使用 AboutCommand::add()。
--only 與 JSON 輸出、不輸出機密資訊的設計,以及測試中的註冊狀態,請參閱將套件診斷資訊加入 about。
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 的測試矩陣設定。