13.x,框架的實作參照最新發行版本 v13.34.0。
loadRoutesFrom 只負責載入檔案
當應用程式實作了CachesRoutes 且 routesAreCached() 為真時,ServiceProvider::loadRoutesFrom() 不會載入路由檔案。其他情況下,則會 require 指定的檔案。
這個方法本身不會加上 URI 或路由名稱的前綴、控制器的命名空間或中介軟體。它也不會公開檔案,或將路由加入既有的快取。
此圖以標準的 Laravel 應用程式為前提。並不存在套件專用的快取,套件的路由也包含在整個應用程式的路由快取中。
將設定與註冊分開
在下列範例中,我們建立一個回傳套件是否可回應的公開端點。前提是已透過 Composer 的 PSR-4 將Acme\Courier\ 對應至 src/,並以自動偵測或手動方式註冊提供者。
config/courier.php
register() 中進行,路由的載入則在 boot() 中進行。請勿將註冊 HTTP 路由的提供者設為 DeferrableProvider,因為這樣就無法保證提供者會在需要路由時啟動。
src/CourierServiceProvider.php
routes/web.php
src/Http/Controllers/StatusController.php
/acme-courier/status,路由名稱為 acme-courier.status。只要以 route('acme-courier.status') 產生 URL,即使變更 URI 前綴,呼叫端也能使用相同的路由名稱。群組的 name() 會直接串接字串,因此結尾的 . 也要指定。
web 並不能取代認證與授權。此範例是不含機密資訊的公開端點。對於回傳使用者資料的端點,請依照規格另外設置認證中介軟體與授權處理。分別防止 URI 與路由名稱的衝突
URI 前綴與路由名稱前綴是不同的機制。只加上其中一個,無法防止另一個發生衝突。AbstractRouteCollection 在建立快取用的路由集合時,具有若不同路由使用相同名稱就拋出 LogicException 的處理。「一般啟動時能產生 URL」並不能保證可以快取。即使是 URI 不同的 2 個路由,只要名稱相同就會造成問題。
請勿將依註冊順序覆寫使用端應用程式的路由當作套件的擴充方式。如有需要,請提供停用路由的設定,以及使用者可從其他路由呼叫的服務。
建立快取時的設定會保留在路由定義中
RouteCacheCommand 會先執行 route:clear,接著啟動新的應用程式並收集路由。它會將這些路由準備成可序列化的形式,再將編譯結果寫入快取檔案。
此時套件的路由檔案也會被載入,因此前綴與是否註冊取決於建立快取時的設定。之後的啟動中,loadRoutesFrom() 不會載入檔案,而是使用已快取的路由。
請勿依使用者或租戶等每個請求都會改變的條件來註冊路由。這些條件會在建立快取時的 CLI 環境中評估。請以穩定的結構註冊路由,並在中介軟體或控制器內的授權中判斷是否允許存取。
部署時先確定設定
完成程式碼與設定的更新後,在使用設定快取的結構中,請依下列順序重新建立。請將其納入使用端應用程式的部署處理中。route:cache,路由也會以舊的設定建立。只重新執行 config:cache 並不會更新路由快取。使用 -vv 也能確認中介軟體群組的內容。
開發中若要在沒有快取的情況下確認行為,請視需要清除兩者。
發行前要確認的組合
除了套件的測試之外,也請在 Laravel 13 的使用端應用程式中確認下列組合。不只是記憶體內的路由註冊,Artisan 啟動新應用程式的途徑也要列入確認對象。- 在沒有快取的情況下
/acme-courier/status能回應,且路由名稱與中介軟體符合預期。 route:cache執行成功,在新的啟動中也能以相同的 URI 與路由名稱回應。- 變更前綴並重新建立快取後,新的 URI 能回應,且舊 URI 的套件路由已不存在。
- 停用並重新建立快取後,
route:list --name=acme-courier中不會出現目標路由。 - 與使用端應用程式或其他套件之間,URI 與路由名稱不會衝突。
相關頁面
路由
確認路由群組、命名路由與列表顯示的基礎。
套件設定的合併與快取
確認考量已公開設定與設定快取的更新步驟。
延遲服務提供者
確認不應延遲註冊路由之提供者的理由。
套件的版本相容性管理
將公開 API 的變更連結至發行方針與持續驗證。