العودة للمقالات
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
حالة الاستخدامعواقب منطق الأعمالسلامة البيانات

أخطاء شائعة

  1. تأثيرات جانبية في creating بدلاً من createdcreating ينفذ قبل أن يكون للنموذج ID
  2. حلقات لا نهائية — حدث يحدث النموذج والمراقب يطلق حدثاً آخر
  3. عمليات ثقيلة في مستمعات متزامنة — استخدم ShouldQueue
  4. إطلاق أحداث أثناء العمليات الجماعية — استخدم withoutEvents

أفضل الممارسات

  1. استخدم الأحداث لسير عمل الأعمال — افصل المشغل عن رد الفعل
  2. استخدم المراقبين لسلامة النموذج — UUIDs، القيم الافتراضية
  3. ضع المستمعات البطيئة في قائمة الانتظار
  4. استخدم withoutEvents للعمليات الجماعية
  5. احمِ ضد الحلقات اللانهائية — تحقق من wasChanged

مقالات ذات صلة

# Laravel# PHP# Events# Observers# Architecture# Backend
WhatsApp
تواصل عبر واتساب