2026-07-09 Abdelrhman Yasser
الأحداث والمراقبون في Laravel: أنماط إنتاجية
الأحداث والمراقبون في Laravel: هندسة تطبيق مفكوكة
مدة القراءة: 25 دقيقة
مقدمة
الأحداث (Events) والمراقبون (Observers) هما الأداتان الرئيسيتان في Laravel لفصل منطق التطبيق. يسمحان لك بالتفاعل مع ما يحدث دون ربط كود التفاعل بكود التشغيل الأساسي.
الحدث (Event) — حادثة مسجلة: "مستخدم مسجل"، "تم تقديم طلب"، "فشل الدفع". المستمع (Listener) — الكود الذي يستجيب لذلك الحدث. المراقب (Observer) — مستمع متخصص لأحداث نموذج Eloquent.
المشكلة
بدون الأحداث، إضافة اهتمامات مشتركة يؤدي لكود مقترن بشدة:
class AuthController extends Controller
{
public function register(RegisterRequest $request): JsonResponse
{
$user = User::create($request->validated());
Mail::to($user)->send(new WelcomeEmail($user));
Log::info('مستخدم جديد', ['id' => $user->id]);
$this->analytics->track('user_registered', $user);
return response()->json($user, 201);
}
}
الأحداث والمستمعات
إنشاء حدث ومستمع
php artisan make:event UserRegistered
php artisan make:listener SendWelcomeEmail --event=UserRegistered
تعريف الحدث
class UserRegistered
{
use Dispatchable;
public function __construct(
public User $user,
) {}
}
تعريف المستمع
class SendWelcomeEmail
{
public function handle(UserRegistered $event): void
{
Mail::to($event->user)->send(new WelcomeEmail($event->user));
}
}
تسجيل الأحداث والمستمعات
Event::listen(
UserRegistered::class,
SendWelcomeEmail::class,
);
إطلاق الحدث
event(new UserRegistered($user));
UserRegistered::dispatch($user);
المستمعات في قائمة الانتظار
class SendWelcomeEmail implements ShouldQueue
{
public string $queue = 'emails';
public int $tries = 3;
public function handle(UserRegistered $event): void
{
Mail::to($event->user)->send(new WelcomeEmail($event->user));
}
}
أحداث النموذج (Model Events)
| الحدث | يُطلق عندما |
|---|---|
creating | قبل حفظ النموذج لأول مرة |
created | بعد حفظ النموذج لأول مرة |
updating | قبل تحديث النموذج |
updated | بعد تحديث النموذج |
deleting | قبل حذف النموذج |
deleted | بعد حذف النموذج |
class User extends Model
{
protected static function booted(): void
{
static::creating(function (User $user) {
$user->uuid ??= (string) Str::uuid();
});
static::created(function (User $user) {
$user->profile()->create(['avatar' => 'default.png']);
});
}
}
المراقبون (Observers)
php artisan make:observer UserObserver --model=User
class UserObserver
{
public function creating(User $user): void
{
$user->uuid ??= (string) Str::uuid();
}
public function created(User $user): void
{
$user->profile()->create(['avatar' => 'default.png']);
}
public function deleting(User $user): void
{
if ($user->isSuperAdmin()) {
return false; // إلغاء الحذف
}
}
}
الأحداث مقابل المراقبون
| الجانب | الأحداث | المراقبون |
|---|---|---|
| النطاق | التطبيق بأكمله | خاص بالنموذج |
| التشغيل | استدعاء event() صريح | تلقائي من Eloquent |
| حالة الاستخدام | عواقب منطق الأعمال | سلامة البيانات |
أخطاء شائعة
- تأثيرات جانبية في
creatingبدلاً منcreated—creatingينفذ قبل أن يكون للنموذج ID - حلقات لا نهائية — حدث يحدث النموذج والمراقب يطلق حدثاً آخر
- عمليات ثقيلة في مستمعات متزامنة — استخدم
ShouldQueue - إطلاق أحداث أثناء العمليات الجماعية — استخدم
withoutEvents
أفضل الممارسات
- استخدم الأحداث لسير عمل الأعمال — افصل المشغل عن رد الفعل
- استخدم المراقبين لسلامة النموذج — UUIDs، القيم الافتراضية
- ضع المستمعات البطيئة في قائمة الانتظار
- استخدم
withoutEventsللعمليات الجماعية - احمِ ضد الحلقات اللانهائية — تحقق من
wasChanged