Pernah debugging log produksi dan bingung karena entri log tidak punya info konteks — tidak tahu request mana, user mana, atau proses apa yang menghasilkannya? Laravel 12 punya solusi bawaan untuk ini: fitur Context.
Context di Laravel 12 bukan sekadar contextual binding di service container. Ini adalah fitur tersendiri yang memungkinkan Anda menyimpan data kontekstual yang otomatis disertakan di semua log dan dipropagasi ke queued jobs.
Apa Itu Context di Laravel 12?
Fitur Context (diperkenalkan di Laravel 11, tersedia di Laravel 12) adalah mekanisme penyimpanan data per-request yang:
- Otomatis disertakan di setiap entri log selama request berlangsung
- Dipropagasi ke queued jobs yang di-dispatch dalam request yang sama
- Bersifat isolasi per-request — tidak bocor ke request lain
Bayangkan Anda mau melacak semua aktivitas dari satu user dalam satu request. Dengan Context, cukup simpan sekali di awal, dan semua log selanjutnya otomatis menyertakan data itu.
Cara Menggunakan Context
Import facade-nya:
use Illuminate\Support\Facades\Context;
Simpan data ke context:
// Di middleware atau awal request
Context::add('user_id', auth()->id());
Context::add('request_id', (string) Str::uuid());
Context::add('ip', request()->ip());
Setelah ini, semua log yang dibuat selama request akan otomatis menyertakan data tersebut:
Log::info('Pengguna membuka halaman checkout');
// Output log:
// [2025-04-18 10:00:00] local.INFO: Pengguna membuka halaman checkout
// {"user_id":42,"request_id":"abc-123","ip":"192.168.1.1"}
Tidak perlu manual menambahkan data ke setiap pemanggilan Log::info().
Propagasi ke Queued Jobs
Ini bagian yang paling berguna. Saat Anda men-dispatch job dalam sebuah request, data context ikut terbawa:
// Di controller
Context::add('order_id', $order->id);
ProcessPayment::dispatch($order); // context ikut ke job ini
// Di dalam ProcessPayment job
public function handle()
{
// Context::get('order_id') tersedia di sini
Log::info('Memproses pembayaran');
// log otomatis menyertakan order_id dari context
}
Tanpa fitur ini, Anda harus manually passing data context ke setiap job sebagai parameter.
Hidden Context: Data yang Tidak Masuk ke Log
Context punya dua lapisan: context biasa (masuk ke log) dan “hidden context” (tidak masuk ke log, tapi tetap dipropagasi ke jobs). Berguna untuk data sensitif seperti token:
Context::addHidden('auth_token', $token); // tidak muncul di log
Context::getHidden('auth_token'); // tapi bisa diambil di job
Membaca dan Memanipulasi Context
// Ambil satu nilai
$userId = Context::get('user_id');
// Ambil semua context
$all = Context::all();
// Cek keberadaan key
if (Context::has('order_id')) { ... }
// Hapus key tertentu
Context::forget('request_id');
// Hapus semua
Context::flush();
Praktis: Middleware untuk Context Otomatis
Buat middleware yang mengisi context di setiap request:
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Context;
use Illuminate\Support\Str;
class AddRequestContext
{
public function handle($request, Closure $next)
{
Context::add('request_id', (string) Str::uuid());
Context::add('user_id', auth()->id() ?? 'guest');
Context::add('url', $request->url());
return $next($request);
}
}
Daftarkan di bootstrap/app.php dan semua log di aplikasi Anda otomatis punya konteks yang kaya tanpa perubahan di kode lain.
Kalau Anda sedang membangun aplikasi Laravel dan butuh tim pengembang yang familiar dengan fitur-fitur modern Laravel 12, kami di Arrazy Inovasi siap membantu dari konsultasi hingga pengembangan penuh.