یامی: رد پای واقعی تغییرات تو لاراول
خلاصهٔ کاملتر
به گفتهٔ نویسنده تو Laravel News، بیشتر پکیجهای audit میتونن بگن چه فیلدی و کِی و توسطِ کی عوض شده، ولی همین که تغییر چند تا صف اونطرفتر از درخواستِ اصلی اتفاق بیفته کم میارن. پکیجِ Yammi Audit Log ساختهٔ RomaLytar دقیقاً همین شکاف رو پر میکنه: کنارِ مقدارِ قبل و بعد، ثبت میکنه که کی تغییرو اجرا کرده، کی شروعش کرده، و یه correlation ID میذاره که درخواست، جاب، دستور و تسکِ زمانبندیشده رو به یه ردِ واحد وصل میکنه.
جالبیش اینه که برای فعالشدن هیچ trait، interface یا observerای لازم نیست؛ بعد از نصب و اجرای migrationها، هر نوشتنِ Eloquent روی همهٔ مدلها ثبت میشه. حتی این آپدیتِ ساده بدونِ دستزدن به مدلِ User لاگ میشه:
User::first()->update(['name' => 'Eric']);بهصورتِ پیشفرض همهچی ضبط میشه، ولی میتونی تو config/audit-log.php حالتو روی opt_in بذاری تا فقط چند مدلِ مشخص ردیابی بشن. یه نکته هم هست: چون به رویدادهای مدلِ Eloquent قلاب میشه، آپدیتهای مستقیمِ Query Builder خودکار ثبت نمیشن و باید دستی ثبتشون کنی.
مهمترین بخشی که یامی رو از یه changelogِ معمولی جدا میکنه همینه: وقتی یه کاربر جابی رو dispatch میکنه که بعداً مدلی رو عوض میکنه، ردِ معمولی اون تغییرو بهاسمِ workerِ صف ثبت میکنه، چون همون پروسه نوشتنو انجام داده. یامی هویتِ اصلی رو تو کلِ زنجیره حمل میکنه، پس بینِ کسی که تغییرو اجرا کرده و کسی که راهش انداخته فرق میذاره، و correlation ID همهٔ ردهای یه گردشکار رو دورِ هم جمع میکنه.
به گفتهٔ نویسنده مسیرِ نوشتن جوری طراحی شده که audit نه باعثِ خطای درخواست بشه نه کندش کنه. هر تغییر یه insertه بهعلاوهٔ یه ایندکسِ batchشده از فیلدهای عوضشده که تو یه جدولِ جدا و ایندکسدار میره، پس جستوجو بر اساسِ فیلد نیازی به اسکنِ ستونهای JSON نداره. نوشتنها رو هم میشه با تنظیمِ async روی صف انداخت، و مسیرِ ضبط fail-openه: اگه خودِ نوشتنِ لاگ خطا بده، عملیاتِ اصلی بازم انجام میشه.
فراتر از هستهٔ اصلی، یامی یه سری زیرسیستم داره که تا روشنشون نکنی غیرفعالن: حالتِ integrity با یه زنجیرهٔ هشِ ضدِ دستکاری، یه نمای time machine برای بازسازیِ وضعیتِ یه رکورد تو گذشته، ابزارِ GDPR، تشخیصِ ناهنجاری، استریم به SIEM، هشدارِ Slack و webhook و پشتیبانی از multi-tenancy. یه داشبوردِ اختیاری هم پشتِ دستورِ خودش قرار داره. همین اختیاریبودن باعث میشه نصبِ پیشفرض نزدیک به یه لاگِ ساده بمونه.
یامی روی PHP 8.1 به بالا و لاراول ۹ تا ۱۳ کار میکنه و با هر دیتابیسی که لاراول پشتیبانی میکنه سازگاره.
نکات کلیدی:
- بدونِ trait، observer یا interface، نوشتنهای Eloquent روی همهٔ مدلها خودکار ثبت میشه
- هویتِ کاربرِ اصلی از کنترلر تا جابِ صف و scheduler حمل میشه و «اجراکننده» از «شروعکننده» جدا میشه
- یه correlation ID همهٔ تغییراتِ یه گردشکار رو به یه ردِ واحد وصل میکنه
- مسیرِ نوشتن fail-open و قابلِ asyncه تا درخواست کند یا خراب نشه
- لایههای integrity، GDPR، SIEM و داشبورد همه اختیارین؛ روی PHP 8.1+ و لاراول ۹ تا ۱۳




