Подписывайтесь на наш Telegram канал и будьте в курсе всех событий.

Новый фасад 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

Телеграм канал где у нас свой контекст и своя атмосфера 😅

Илья Чубаров (Переводчик)

Активный Laravel участник ✨

4

Вакансии

Спонсоры

Помощь в разработке вашего проекта на Laravel

Независимо от сложности проекта эти кампании помогают сообществу и всем его участникам воплощать идеи в элегантные приложения.

Присоединиться

Инструменты для управления эмоциями, которые помогают людям контролировать свою жизнь и лучше понимать себя.

Перейти

Подкасты c зажигательными эпизодами, которые заставят задуматься и приведут к новым перспективам.

Перейти