13.x 與 Framework v13.36.0 的實作。一般中介層的寫法請參閱中介層。
將註冊、套用與執行分開
Router::aliasMiddleware() 會以別名為鍵、類別名稱為值,註冊到 Router 的陣列中。它不會建立中介層的實例,也不會將其套用到路由。
別名名稱是公開 API。請避免使用
auth 或 throttle 等內建名稱,以及容易與其他套件衝突的通用名稱,並加上套件專屬的前綴。若對相同的鍵重新註冊,aliasMiddleware() 會覆寫先前的對應。
在提供者中公開別名
以下範例建立一個在回應中加上固定識別標頭的中介層。這並不是驗證、授權或存取控制的範例。前提是透過 Composer 的 PSR-4 將Acme\Courier\ 對應到 src/,並以自動探索或手動方式註冊提供者。
src/Http/Middleware/AddCourierHeader.php
boot() 中進行。boot() 的參數會由服務容器注入,因此不需要為了註冊中介層而自動編輯使用者的 bootstrap/app.php。
src/CourierServiceProvider.php
由使用者以路由為單位套用
在使用端應用程式的routes/web.php 中,只指派給需要的路由。
routes/web.php
->middleware(AddCourierHeader::class) 這樣直接指定類別名稱。請依是否需要為使用者提供簡短名稱來選擇。
即使套件本身提供路由,也要在路由檔案中明確指定所需的中介層。loadRoutesFrom() 不會自動加入 web 或 api。註冊方式與路由快取的處理,請參閱套件的路由註冊與快取。
是否套用到整個應用程式由使用者選擇
若想套用到使用端應用程式的所有web 路由,由使用者在既有的 withMiddleware() 回呼中加入以下設定。這不是取代既有設定的範例。
web 群組,而不是全域堆疊。它不會自動套用到 api 或未帶有任何群組的路由。
Router 的群組操作存在差異
套件若要提供自己的群組,請使用專屬的名稱。以下是放在提供者boot(Router $router) 內的範例。
->middleware('acme-courier') 套用。不過,此群組只包含所指定的類別,並不會繼承 web 的 Session 或 CSRF 保護。
也有加入既有群組的 API,但在 v13.36.0 的 Router 實作中有以下差異。
若以
middlewareGroup('web', [...]) 只設定套件的類別,就會取代既有 web 的內容。請勿與用於加入的方法混淆。此外,即使對不存在的 web 執行 pushMiddlewareToGroup(),也不會還原標準的 web 群組。
用於加入的方法,其重複判定是針對所註冊的值。指向相同類別的別名與類別名稱是不同的字串,因此在註冊表階段會成為不同的項目。請統一寫法,不要假設以不同寫法表示的相同類別也會在註冊時被去除重複。
不要只靠註冊順序保證執行順序
Router 會展開指派給路由的中介層別名與群組,處理排除後再依優先順序排序。僅靠加到開頭或末尾,並無法保證與驗證或路由模型綁定之間嚴格的前後關係。 此外,HTTP Kernel 的syncMiddlewareToRouter() 會以 middlewareGroup() 將 Kernel 所持有的群組同步到 Router。若 Kernel 端的設定之後被重新同步,直接加入 Router 的群組內容可能會被取代。基本方針是不要在套件之間以啟動順序競相修改既有群組,而是在使用端應用程式的 withMiddleware() 中集中設定。
對於需要「Session 開始後」、「驗證後」等順序的功能,請在安裝步驟中明確寫出該前提,並搭配使用端應用程式的優先順序設定進行確認。請避免由套件整個取代應用程式的優先順序清單。
快取與驗證的邊界
請勿將別名註冊放在routesAreCached() 的條件內或路由檔案中。有快取時 loadRoutesFrom() 不會載入路由檔案,但為了在執行時解析快取路由中保留的別名,仍需要進行註冊。請在提供者的 boot() 中每次都註冊。
變更路由的指派後,請在使用端應用程式中重新建立路由快取。
-vv 用於展開並確認群組的內容。不過,即使清單顯示成功,也不能保證中介層內的處理或 Session 的使用都正確。仍需要進行 HTTP 請求的測試。
以下是要加入定義了上述 /courier-status 的 Laravel 應用程式 Feature 測試中的方法。
檢查群組是否存在或別名陣列的單元測試,與實際的 HTTP 執行是不同的驗證。特別是快取驗證,不應只是查看同一程序中的 Router,而要在建立快取後以新的啟動進行。若使用長時間執行的 worker,請依照一般的部署步驟重新載入。
相關頁面
中介層
確認建立、套用到路由、參數與優先順序的基礎。
套件的路由註冊與快取
確認路由載入與建立快取時設定之間的關係。