Skip to main content

什麼是套件

於 Laravel 中的套件是為應用程式加入功能的 Composer 套件。套件大致分為兩類。
  • 獨立套件 — 不依賴 Laravel 的通用 PHP 函式庫(如 Carbon、Pest)
  • Laravel 套件 — 具有路由、控制器、View、設定等,與 Laravel 整合功能的套件
本指南處理後者,即 Laravel 專用套件的開發。套件開發需深入理解 Laravel 的內部結構,包含服務提供者、Facade、設定檔的公開等。
若要撰寫套件的測試,可使用 Orchestra Testbench。可如同一般 Laravel 應用程式般撰寫套件的測試。

套件的自動偵測

Laravel 於套件安裝時,會讀取 composer.jsonextra.laravel 段落,自動註冊服務提供者與 Facade。
加入此設定後,使用者無需手動編輯 bootstrap/providers.php 即可自動載入套件。
關於自動偵測如何實作、快取何時被重建的詳細內容,請見套件自動偵測的內部結構

停用自動偵測

若使用者端希望停用特定套件的自動偵測,可於應用程式的 composer.json 設定。

服務提供者的角色

服務提供者是套件的進入點。將 View、設定、Migration、路由等資源註冊至 Laravel 的處理集中於此。 服務提供者繼承 Illuminate\Support\ServiceProvider,具備 registerboot 兩個方法。
請勿於 register 方法內註冊事件監聽器、路由、View 等。可能會誤用尚未載入的其他服務提供者的服務。除綁定以外的處理務必於 boot 方法中進行。

設定檔的 Publish

publishes() — 公開檔案

boot 方法呼叫 publishes() 後,使用者即可透過 vendor:publish 指令將設定檔複製至自身應用程式。
公開後的設定值可以與一般 config 存取相同的方式取得。

mergeConfigFrom() — 與預設值合併

register 方法使用 mergeConfigFrom(),即便使用者未公開設定檔,仍可使用套件的預設值。
mergeConfigFrom() 不會合併巢狀陣列至深層。若設定具有多維陣列而使用者僅定義部分,其餘選項可能不會被合併。

以 tag 分公開群組

publishes() 的第 2 個引數指定 tag,使用者可選擇僅公開所需資源。

路由的註冊

loadRoutesFrom() 載入路由檔案。若應用程式的路由快取啟用,會自動略過。
路由檔案中指定套件的控制器。

Migration 的 Publish

使用 publishesMigrations() 可公開 Migration 檔案。公開時 Laravel 會自動更新時間戳記。

View 的 Publish

loadViewsFrom() — 註冊 View

loadViewsFrom() 註冊 View 目錄。透過第 2 個引數的命名空間,以 package::view 形式參照 View。
註冊後,以套件命名空間參照 View。
Laravel 會從兩處尋找 View。首先確認應用程式的 resources/views/vendor/courier 目錄,若無則使用套件的 View 目錄。如此使用者便可自訂 View。

公開 View

註冊 Blade 元件

若要將元件納入套件,於 boot 方法註冊。
亦可使用元件命名空間一次註冊。

翻譯檔的 Publish

loadTranslationsFrom() 註冊翻譯檔。翻譯以 package::file.key 形式參照。
若使用 JSON 翻譯檔,可使用 loadJsonTranslationsFrom()

指令的註冊

套件的 Artisan 指令以 commands() 方法註冊。通常僅於 Console 環境註冊。

整合至 optimize 指令

若套件具備自身快取,可使用 optimizes() 方法整合至 php artisan optimizephp artisan optimize:clear

about 指令加入資訊

若要在 php artisan about 的輸出加入套件資訊,可使用 AboutCommand::add()

Facade 的建立

使用 Facade 可將服務容器的綁定以靜態方法方式呼叫。
1

建立服務類別

2

建立 Facade 類別

繼承 Illuminate\Support\Facades\Facade,於 getFacadeAccessor() 回傳服務容器的綁定 key。
3

於服務提供者綁定

4

於 composer.json 註冊

透過在 Facade 方法上加註 PHPDoc 的 @method annotation,IDE 補完便可啟用。

DeferrableProvider — 實作延遲載入

僅對服務容器進行綁定的提供者,可透過實作 DeferrableProvider 介面實現延遲載入。因服務實際被需要之前提供者不會載入,可提升應用程式效能。
Laravel 會編譯並保存延遲提供者所提供的服務清單。僅在 provides() 中列舉的服務被解析時提供者才會被載入。
請勿對需要註冊資源(View、路由、事件監聽器等)的提供者使用 DeferrableProvider。若被延遲載入,這些資源將無法完成註冊。

套件的測試

若要單獨測試套件,可使用 Orchestra Testbench。可以彷彿身處於一般 Laravel 應用程式般撰寫套件測試。
於測試案例覆寫 getPackageProviders() 註冊套件的服務提供者。

發布至 Composer

以下為將套件公開至 Packagist 的最佳實踐。 composer.json 的基本設定
透過相依 illuminate/support,可只將 Laravel 所需的元件納入相依,而非整個 illuminate/framework。請保持套件相依樹的精簡。
目錄結構範例

相關頁面

服務提供者

確認服務提供者的 registerboot 方法,以及延遲提供者的詳細內容。

版本相容性管理

說明 Laravel 與 PHP 主版本升級的因應策略,以及 GitHub Actions 的測試矩陣設定。
最後修改於 2026年8月2日