EventDispatcher: الأحداث غير المقترنة
أرسلوا الأحداث واستمعوا إليها باستخدام EventDispatcher في Symfony
EventDispatcher: الأحداث غير المقترنة درس مجاني في PHP Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في PHP Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة PHP Academy 4 دروس في المجموع.
ما هو EventDispatcher؟
يطبّق Symfony EventDispatcher نمط المراقب. ترسل الشيفرة الأحداث، ويتفاعل المستمعون معها، من دون أن يعرف الموزّع أي شيء عن المستمعين.
التثبيت
ثبّت المكوّن.
$ composer require symfony/event-dispatcherإنشاء حدث
الحدث هو فئة PHP عادية، وغالبًا ما توسّع Event (اختياريًا)، وتحمل بيانات.
<?php
use Symfony\Contracts\EventDispatcher\Event;
class UserRegisteredEvent extends Event
{
public const NAME = "user.registered";
public function __construct(public readonly User $user) {}
}إنشاء مستمع
المستمع هو دالة قابلة للاستدعاء أو كائن يتفاعل مع حدث محدد.
<?php
class SendWelcomeEmailListener
{
public function __invoke(UserRegisteredEvent $event): void
{
mail($event->user->email, "Welcome!", "Thanks for joining!");
}
}تسجيل المستمعين
أرفق المستمعين بالموزّع.
<?php
use Symfony\Component\EventDispatcher\EventDispatcher;
$dispatcher = new EventDispatcher();
$dispatcher->addListener(
UserRegisteredEvent::NAME,
new SendWelcomeEmailListener()
);إرسال حدث
أرسل الحدث، وسيتم استدعاء جميع المستمعين المسجّلين وفق ترتيب الأولوية.
<?php
$user = new User("alice@example.com");
$dispatcher->dispatch(new UserRegisteredEvent($user), UserRegisteredEvent::NAME);أولوية المستمع
مرّر عددًا صحيحًا يمثل الأولوية باعتباره المعامل الثالث إلى addListener(). تُنفّذ الأرقام الأعلى أولًا (القيمة الافتراضية: 0).
<?php
$dispatcher->addListener("user.registered", $logListener, 10); // runs first
$dispatcher->addListener("user.registered", $emailListener, 0); // runs secondمشتركو الأحداث
مشترك الأحداث هو فئة تسجّل مستمعيها بنفسها من خلال تطبيق EventSubscriberInterface.
<?php
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class UserSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array {
return [
UserRegisteredEvent::NAME => "onUserRegistered",
];
}
public function onUserRegistered(UserRegisteredEvent $event): void {
// ...
}
}إيقاف الانتشار
استدعِ $event->stopPropagation() داخل مستمع لمنع المستمعين اللاحقين من التنفيذ.
في Laravel
لدى Laravel نظام أحداث خاص به. أرسل الحدث باستخدام event(new UserRegistered($user)). سجّل المستمعين في EventServiceProvider أو استخدم السمة #[Listen].
فوائد البنية المعتمدة على الأحداث
تفصل الأحداث بين المكوّنات: فلا تستورد خدمة التسجيل خدمة البريد الإلكتروني. ويمكن إضافة سلوكيات جديدة، مثل التسجيل والتحليلات، من خلال تسجيل مستمعين جدد دون تعديل الشيفرة الحالية.
الملخص
أنشئ فئات الأحداث مع بيانات، وأرفق المستمعين باستخدام addListener()، وأرسل الأحداث باستخدام $dispatcher->dispatch(). استخدم المشتركين لمجموعات المستمعين التي تسجّل نفسها.
تحقق سريع
كيف تمنع المستمعين اللاحقين من التنفيذ؟
الأسئلة الشائعة
هل درس «EventDispatcher: الأحداث غير المقترنة» مجاني؟
نعم — نص درس «EventDispatcher: الأحداث غير المقترنة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة PHP Academy، انتقل إلى CoddyKit PRO. تتضمن دورة PHP Academy 4 دروس في المجموع.
ماذا ستتعلم في «EventDispatcher: الأحداث غير المقترنة»؟
أرسلوا الأحداث واستمعوا إليها باستخدام EventDispatcher في Symfony تتمرن على PHP Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ PHP Academy؟
لا تُشترط خبرة سابقة. PHP Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «EventDispatcher: الأحداث غير المقترنة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس PHP Academy هذا؟
نعم. كل درس في PHP Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- HttpFoundation: الطلب والاستجابة
- حاوية DependencyInjection
- EventDispatcher: الأحداث غير المقترنة
- مكوّن Console: أوامر CLI