Новый фасад Context
Не так давно в Laravel был смержен PR на добавления нового Facade с названием Context
.
Для чего он и что он дает пользователям фреймворка бы попробуем разобрать в этой статье.
По заявлению автора этого фасада, он позволит отслеживать текущий и исторический “контекст” приложения сквозь request, очереди и команды. Со слов автора Context
больше всего будет полезен для логгирования.
По сути основные точки входа в приложение, CLI (командная строка), HTTP и jobs.
Пока еще слабо понятно о чем идет речь, но примеры с кодом всегда нам дадут больше чем просто слова.
Talk is cheap. Show me the code.
Логирование
В данном примере мы добавляем в context метаданные.
trace_id
используется в различных системах чтобы отследить flow или жизнь пользователя в приложении. Например вы можете передаватьtrace_id
в другой сервис(если он ваш) гдеtrace_id
будет тоже логироваться. В результате вы можете по логам восстановить “жизненный цикл” пользователя из различных сис-м по этой метке.
// где-то в middleware...
Context::add('hostname', gethostname());
Context::add('trace_id', (string) Str::uuid());
// где-то в controller...
Log::info('Retrieving commit messages for repository [{repository}].', [
'repository' => $repo,
]);
Http::get('https://laravel.su');
Теперь это информация добавлена в лог в качестве мета данных. 👇
[2024-01-19 04:20:06] production.INFO: Retrieving commit messages for repository [laravel/framework]. {"repository":"laravel/framework"} {"hostname":"prod-web-1","trace_id":"a158c456-d277-4214-badd-0f4c8e84df79"}
Как данные контекста проносятся через request до jоbs
Фасад Context
может проносить содержимое через request запрос до очередей.
Например мы добавили в контекст информацию.
// Request::url() === 'https://laravel.su'
Context::add('initiating_url', Request::url());
Далее вы отправляете job в очереди как обычно.
CalculateStats::dispatch();
Теперь когда отложенная job выполниться, она имеет доступ к контексту из запроса.
class CalculateStats
{
public function handle()
{
Log::info('Hello from the queue.');
}
}
И результат в логе.
[2024-01-19 04:20:06] production.INFO: Hello from the queue. {"initiating_url":"https://laravel.su"}
Данные которые мы добавили во время запроса, будут доступны в очередях – даже если он выполниться на другой машине!
Пример с передачей в сторонней сервис
Как я писал выше, иногда необходимо передать trace_id
в другой сервис для связывания логической цепочки запросов в разных местах. Например в middleware мы может добавить этот trace_id
а потом его просто извлекать и вставлять в http запрос.
Context::add('trace_id', (string) Str::uuid());
// ...
Http::globalOptions([
'headers' => [
'X-Trace-Id' => Context::get('trace_id'),
],
]);
Более подробно вы можете ознакомиться с возможностями в этом PR
Телеграм канал где у нас свой контекст и своя атмосфера 😅