يساعدك سجل النشاط على معرفة من عدّل السجل ومتى حدث ذلك ونوع العملية التي تمت. توفر أحداث Eloquent مكانًا مركزيًا لتسجيل الإنشاء والتعديل والحذف، بدل تكرار نفس المنطق في كل Controller.
تصميم جدول السجل
أنشئ جدول activity_logs بحقول لنوع العملية، واسم الموديل، ومعرّف السجل، والتغييرات بصيغة JSON، ومعرّف المستخدم مع السماح بأن يكون فارغًا، والتوقيت. القيمة الفارغة مفيدة للعمليات الآلية. لا تطبق تسجيل النشاط على موديل السجل نفسه حتى لا تدخل في حلقة متكررة.
ربط أحداث الموديل
استخدم Observer أو Trait مشتركًا للموديلات التي تريد مراقبتها. تعمل أحداث created وupdated وdeleted بعد تنفيذ العملية، ولذلك يصبح معرّف السجل متاحًا عند تسجيل الإنشاء.
protected static function booted(): void
{
static::created(fn (self $model) => ActivityLog::create([
'action' => 'created',
'model_type' => $model::class,
'model_id' => $model->getKey(),
'performed_by' => auth()->id(),
]));
static::updated(fn (self $model) => ActivityLog::create([
'action' => 'updated',
'model_type' => $model::class,
'model_id' => $model->getKey(),
'changes' => $model->getChanges(),
'performed_by' => auth()->id(),
]));
}أضف حدث deleted بالطريقة نفسها. اضبط cast لحقل changes في موديل السجل، وحدد الحقول المسموح بحفظها عبر create(). لا تسجل كلمات المرور أو الرموز السرية؛ اختر الحقول التي يحتاجها سجل المراجعة فقط.
انتبه: عمليات التعديل والحذف الجماعية عبر استعلام Eloquent لا تطلق أحداثًا لكل موديل، لأن السجلات لا تُحمّل بشكل منفصل. إذا كان تسجيل كل سجل شرطًا أساسيًا، نفّذ العملية على الموديلات نفسها. يشرح توثيق أحداث Eloquent دورة حياة الأحداث.
المصدر: مقال Abdo Host الأصلي على Medium.

