Context 是什麼
Laravel 的 Context 功能是一種在請求、佇列 Job 與指令執行之間記錄、共享資訊的機制。 透過Illuminate\Support\Facades\Context Facade 加入的資訊,會自動附加到應用程式所寫出的每筆日誌條目上。
如此一來,就能清楚區分傳給個別日誌呼叫的資訊,以及 Context 中所保有的共享資訊。
特別適合用於分散式系統或使用佇列的架構中做追蹤(tracing)。
脈絡的傳遞流程
基本用法
最典型的用法就是在中介軟體中設定trace_id。之後所有的日誌條目都會自動包含它。
1
建立中介軟體
2
在 Context 中加入追蹤 ID
3
註冊中介軟體
在
bootstrap/app.php 中以全域中介軟體的形式註冊。url 與 trace_id。
寫入脈絡
add — 加入值
add 會覆蓋既有的 key。若只想在 key 不存在時才加入,可使用 addIf。
increment / decrement — 管理計數器
專門用於增減數值的方法。第 2 個參數可指定變化量。when — 有條件地加入
when 方法可在條件為 true 或 false 時分別加入不同的資料。
push — 加入到堆疊
Context 支援以 list 形式保存的「堆疊」。 使用push 時資料會按照加入順序堆疊起來。
讀取脈絡
get / all
only / except — 只取部分
pull / pop — 取得並移除
pull 會在讀取 key 的值後,同時從脈絡中移除。
pop。
remember — 不存在時設定並回傳
has / missing — 檢查 key 是否存在
has 即使值為 null 也會回傳 true。它只確認 key 是否已註冊。移除脈絡
以forget 移除 key。
有作用域的脈絡
透過scope 方法,可以只在閉包執行期間暫時變更脈絡,並在執行完自動還原原本狀態。
在測試或局部處理中希望暫時加入補充資訊到日誌時非常好用。
Hidden Context
不希望被輸出至日誌的資料(密碼、API 金鑰、個人識別資訊等)應存入 Hidden Context。 無法透過一般的get 方法取得,只能透過 getHidden 等專用方法存取。
傳遞給佇列 Job
當你將 Job 派發到佇列時,目前的脈絡會自動被序列化並包含在 Job payload 中。 Job 執行時原始脈絡會被還原,因此於請求中設定的trace_id 也會自動延續到佇列中的日誌。
trace_id 也包含在佇列的日誌中。
Dehydrating — Job 送出時的自訂
透過Context::dehydrating 可以在 Job 送出前加工脈絡。
例如,若想將依 Accept-Language 標頭決定的 locale 傳遞給佇列時可以使用。
Hydrated — Job 執行時的還原
透過Context::hydrated 可以在 Job 執行前、脈絡剛被還原的時機加入處理。
例如將先前保存的 locale 套用到設定檔中。
總結
Context vs Log::withContext 的差異
Context vs Log::withContext 的差異
Dehydrate / Hydrate 常見用途
Dehydrate / Hydrate 常見用途
- 傳遞 locale:
dehydrating將app.locale存入 Hidden Context,hydrated中透過Config::set還原。 - 傳遞認證資訊:讓佇列 Job 也能取得請求中已認證使用者的資訊。
- 租戶 ID:在多租戶應用中將租戶識別碼跨佇列分享。