إزاي تبني نظام سجل النشاط (Activity Log) في لارافيل زي المحترفين
أكيد مريت بالموقف ده قبل كدة: مديرك أو عميلك يجي يسألك "مين اللي مسح الريكورد ده؟" أو "إيه اللي اتغير في بيانات العميل الفلاني يوم التلات اللي فات؟". طبعاً بتبدأ رحلة البحث في قاعدة البيانات (Database) وبتحاول تستنتج من التوقيتات، وممكن متوصلش لحاجة. هنا بيجي دور الـ Activity Log أو الـ Auditing، اللي بيخليك تعرف كل "نفس" بيحصل جوه الداتابيز بتاعتك.
Table of contents [Show]
ليه محتاج نظام تتبع (Auditing) في مشروعك؟
غير إن العميل بيحس بالأمان، الـ Activity Log مهم جداً في الأنظمة المالية (Financial Systems) والأنظمة اللي فيها بيانات حساسة. تخيل لو حد عدل رصيد أو غير حالة طلب (Order Status) من غير ما نعرف مين المسؤول، دي كارثة أمنية. بناء نظام تتبع بيضمن ليك الـ Accountability أو "المسؤولية الكاملة" عن كل أكشن بيتم.
الخيار الأسهل والأذكى: باكيدج spatie/laravel-activitylog
ليه تعيد اختراع العجلة وتكتب كود من الصفر يستهلك وقتك ويطلع فيه ثغرات؟ مجتمع لارافيل (Laravel Community) وفر لنا مكتبة جبارة اسمها spatie/laravel-activitylog. دي المكتبة رقم 1 في المجال ده.
عشان نبدأ، هنثبت المكتبة عن طريق الكومبوزر (Composer):
composer require spatie/laravel-activitylog
إزاي تربط الموديل (Model) بنظام التتبع؟
بعد ما تثبت المكتبة، هتحتاج تضيف الـ Trait اللي اسمها LogsActivity جوه أي موديل عايز تراقبه. مثال على موديل (Product):
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Spatie\Activitylog\Traits\LogsActivity;
use Spatie\Activitylog\LogOptions;
class Product extends Model
{
use LogsActivity;
protected $fillable = ['name', 'price'];
public function getActivitylogOptions(): LogOptions
{
return LogOptions::defaults()
->logOnly(['name', 'price'])
->logOnlyDirty(); // عشان يسجل التغييرات الجديدة بس
}
}
لاحظ هنا إني استخدمت logOnlyDirty()، دي ميزة عبقرية عشان متسجلش "داتا مكررة" (Redundant Data)، المكتبة هتسجل بس العمود اللي قيمته اتغيرت فعلاً.
ممكن تحب تخصص الرسالة اللي بتظهر في اللوج (Log Message) عشان تبقى مفهومة للإدارة. تقدر تعدل الـ Event اللي بيحصل:
public function tapActivity(Activity $activity, string $eventName)
{
$activity->description = "تم {$eventName} المنتج بواسطة " . auth()->user()->name;
}
نصيحة من أخ لمبرمج زميل
بص يا سيدي، بناء الأنظمة دي مش مجرد كود، ده "عقلية" (Mindset). نصيحتي ليك إنك متبالغش في تسجيل كل حاجة. سجل البيانات الحساسة فقط، لأن تسجيل كل "كليك" هيزود حجم الداتابيز بتاعتك بشكل مرعب مع الوقت. دايماً فكر في الـ Performance قبل ما تقرر تسجل أي Log.
استمر في التعلم وطور مهاراتك في الـ Eloquent و الـ Events & Listeners، لأن ده اللي بيفرق المبرمج "الهاوي" عن المبرمج "الخبير". لو عندك أي سؤال بخصوص الـ Implementation، سيبلي كومنت وهرد عليك فوراً.