Context - сховище даних про поточний запит, завдання чи команду, яке Laravel автоматично додає до кожного запису в лог і передає в завдання черги, що були поставлені в цьому запиті.
use Illuminate\Support\Facades\Context;
// middleware
public function handle(Request $request, Closure $next): Response
{
Context::add('url', $request->url());
Context::add('trace_id', (string) Str::uuid());
return $next($request);
}
Тепер будь-який запис у лог під час цього запиту містить ці дані:
Log::info('Користувача автентифіковано', ['auth_id' => Auth::id()]);
local.INFO: Користувача автентифіковано {"auth_id":27} {"url":"https://example.com/login","trace_id":"e04e1a11-..."}
Передача в черги - головна перевага. Завдання, поставлене в черзу під час запиту, отримує той самий контекст, і його логи містять той самий trace_id. Ланцюжок «запит → завдання → вкладене завдання» можна відстежити одним пошуком у логах.
Основні методи:
Context::add('key', 'value'); // перезаписати
Context::addIf('key', 'value'); // лише якщо ще немає
Context::push('breadcrumbs', 'first'); // стек значень
Context::get('key');
Context::has('key');
Context::forget('key');
Context::scope(function () {
// тимчасовий контекст лише для цього блоку
}, ['import_id' => $import->id]);
Прихований контекст - передається в черги, але не пишеться в лог:
Context::addHidden('api_token', $token);
Context::getHidden('api_token');
Події dehydrating і hydrated дозволяють вирішувати, що відбувається при передачі в чергу: наприклад, зберегти локаль запиту й відновити її в завданні.
Чим це відрізняється від Log::withContext():
Log::withContext |
Context |
|
|---|---|---|
| потрапляє в лог | так | так (крім прихованого) |
| передається в черги | ні | так |
| можна прочитати в коді | ні | так (Context::get) |
Що не класти в Context: великі об'єкти й моделі - контекст серіалізується з кожним завданням і пишеться в кожен рядок логу. Ідентифікатори, а не сутності.