Laravel Context: اطلاعاتی که همراه اجرای کدت میره
خلاصهٔ کاملتر
نویسنده تو این مقاله قابلیت Context لاراول رو معرفی میکنه. معمولاً تو لاراول دادهها رو صریح پاس میدیم، ولی بعضی اطلاعات مال یه متد خاص نیستن و مال کل اجرای فعلیان: مثلاً trace ID، آدرس درخواست، tenant ID یا اسم عملیات. Context جاییه برای همین اطلاعات. یه بار تو middleware ثبتش میکنی و هر جای دیگهی برنامه میتونی بخونیش، بدون پارامتر اضافه یا متغیر global:
Context::add('trace_id', Str::uuid()->toString());
$traceId = Context::get('trace_id');به گفتهی نویسنده، جای اصلیای که Context به درد میخوره لاگه. هر چیزی که تو Context بذاری، بهطور خودکار کنار دادههایی که خودت به Log::info میدی تو لاگ میاد. یعنی دیگه لازم نیست trace ID رو دستی به همهی لاگها اضافه کنی.
جالبترین بخش ماجرا صفهاست. درخواست HTTP و جابی که تو صف اجرا میشه دو تا اجرای جدان. لاراول موقع dispatch کردن جاب، Context فعلی رو برمیداره و داخل payload جاب ذخیره میکنه (اسمش dehydrating ـه). وقتی worker جاب رو اجرا میکنه، اون Context رو برمیگردونه (اسمش hydrating ـه). پس لاگ داخل جاب هم همون trace ID درخواست اصلی رو داره که برای دیباگ کارهای توزیعشده خیلی کمک میکنه.
چون worker صف یه پروسهی طولانیه که جابها رو یکییکی اجرا میکنه، اگه Context پاک نمیشد trace ID جاب A به جاب B نشت میکرد. لاراول تو منطق reset داخل QueueServiceProvider بین جابها Context لاگ رو پاک میکنه. یه نوع دیگه هم هست به اسم hidden context که با addHidden و getHidden کار میکنه و تو لاگها نمیاد. خود لاراول تو CallQueuedHandler از همین برای نگه داشتن اطلاعات قفل unique job استفاده میکنه تا اگه جاب بهخاطر نبودن یه مدل unserialize نشد، باز بتونه قفل رو آزاد کنه.
میتونی با Context::dehydrating و Context::hydrated (معمولاً تو متد boot کلاس AppServiceProvider) به لحظهی رد شدن Context از مرز صف وصل بشی، مثلاً locale رو همراه جاب بفرستی و موقع اجرا برگردونی. طبق مستندات لاراول، داخل این callbackها باید $context ورودی رو تغییر بدی، نه facade خود Context رو. متدهای دیگهای هم هست مثل push برای ساختن یه پشته، pull برای خوندن و حذف همزمان، و remember.
نویسنده یه قاعدهی ساده هم میذاره: آرگومانها میگن یه تابع چی لازم داره، Context میگه دور و بر اجرای فعلی چه خبره. پس $order باید آرگومان باشه، ولی trace ID جاش تو Context ـه. Context جایگزین دادههای معمولی برنامه نیست و نباید همهچیزو توش ریخت.
نکات کلیدی:
- Context اطلاعات اجرای فعلی رو بین درخواست، جاب و command به اشتراک میذاره.
- دادههای Context خودکار به لاگها اضافه میشن.
- موقع dispatch، Context تو payload جاب dehydrate و تو worker دوباره hydrate میشه.
- hidden context با addHidden ثبت میشه و تو لاگ نمیاد.
- بین جابهای worker، Context لاگ ریست میشه تا داده نشت نکنه.
- متدهای دیگه: push، pull، remember، has، missing، forget، only، except.




