Skip to main content

Context 是什麼

Laravel 的 Context 功能是一種在請求、佇列 Job 與指令執行之間記錄、共享資訊的機制。 透過 Illuminate\Support\Facades\Context Facade 加入的資訊,會自動附加到應用程式所寫出的每筆日誌條目上。 如此一來,就能清楚區分傳給個別日誌呼叫的資訊,以及 Context 中所保有的共享資訊。 特別適合用於分散式系統或使用佇列的架構中做追蹤(tracing)。

脈絡的傳遞流程

基本用法

最典型的用法就是在中介軟體中設定 trace_id。之後所有的日誌條目都會自動包含它。
1

建立中介軟體

2

在 Context 中加入追蹤 ID

3

註冊中介軟體

bootstrap/app.php 中以全域中介軟體的形式註冊。
完成上述設定後,在控制器或服務中寫入的日誌會自動附加 urltrace_id

寫入脈絡

add — 加入值

add 會覆蓋既有的 key。若只想在 key 不存在時才加入,可使用 addIf

increment / decrement — 管理計數器

專門用於增減數值的方法。第 2 個參數可指定變化量。

when — 有條件地加入

when 方法可在條件為 truefalse 時分別加入不同的資料。

push — 加入到堆疊

Context 支援以 list 形式保存的「堆疊」。 使用 push 時資料會按照加入順序堆疊起來。
以下範例是用堆疊記錄查詢的執行紀錄。

讀取脈絡

get / all

only / except — 只取部分

pull / pop — 取得並移除

pull 會在讀取 key 的值後,同時從脈絡中移除。
要從堆疊取出最後一個值請使用 pop

remember — 不存在時設定並回傳

has / missing — 檢查 key 是否存在

has 即使值為 null 也會回傳 true。它只確認 key 是否已註冊。

移除脈絡

forget 移除 key。

有作用域的脈絡

透過 scope 方法,可以只在閉包執行期間暫時變更脈絡,並在執行完自動還原原本狀態。 在測試或局部處理中希望暫時加入補充資訊到日誌時非常好用。
若在作用域內修改了物件,該變更會反映到作用域之外。使用基本型別(primitive)則沒有問題。

Hidden Context

不希望被輸出至日誌的資料(密碼、API 金鑰、個人識別資訊等)應存入 Hidden Context。 無法透過一般的 get 方法取得,只能透過 getHidden 等專用方法存取。
Hidden Context 提供與一般脈絡對應的一整組方法。

傳遞給佇列 Job

當你將 Job 派發到佇列時,目前的脈絡會自動被序列化並包含在 Job payload 中。 Job 執行時原始脈絡會被還原,因此於請求中設定的 trace_id 也會自動延續到佇列中的日誌。
可看出請求時的 trace_id 也包含在佇列的日誌中。

Dehydrating — Job 送出時的自訂

透過 Context::dehydrating 可以在 Job 送出前加工脈絡。 例如,若想將依 Accept-Language 標頭決定的 locale 傳遞給佇列時可以使用。
dehydrating 回呼中,請不要使用 Context Facade,只能操作傳入回呼的 $context repository。 若使用 Facade,會變更當前程序的脈絡。

Hydrated — Job 執行時的還原

透過 Context::hydrated 可以在 Job 執行前、脈絡剛被還原的時機加入處理。 例如將先前保存的 locale 套用到設定檔中。
同樣地,在 hydrated 回呼中請勿使用 Context Facade,只操作傳入的 $context repository。

總結

Hidden Context 不會輸出到日誌,可安全地儲存以下類型資料。
  • session ID 或使用者 ID(不想留在日誌中時)
  • API 金鑰或認證 token
  • locale 或設定值(想傳遞給佇列但不需要出現在日誌)
  • 內部旗標或狀態
  1. 傳遞 localedehydratingapp.locale 存入 Hidden Context,hydrated 中透過 Config::set 還原。
  2. 傳遞認證資訊:讓佇列 Job 也能取得請求中已認證使用者的資訊。
  3. 租戶 ID:在多租戶應用中將租戶識別碼跨佇列分享。
最後修改於 2026年8月2日