EventDispatcher: อีเวนต์แบบแยกส่วน
ส่งและรับฟังอีเวนต์โดยใช้ EventDispatcher ของ Symfony
EventDispatcher: อีเวนต์แบบแยกส่วน เป็นบทเรียน PHP Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน PHP Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน
EventDispatcher คืออะไร
Symfony EventDispatcher ใช้รูปแบบ Observer โค้ดจะส่งเหตุการณ์ และตัวรับฟังจะตอบสนองต่อเหตุการณ์เหล่านั้น โดยตัวกระจายเหตุการณ์ไม่จำเป็นต้องรู้จักตัวรับฟัง
การติดตั้ง
ติดตั้งคอมโพเนนต์
$ 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: อีเวนต์แบบแยกส่วน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส PHP Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “EventDispatcher: อีเวนต์แบบแยกส่วน”
ส่งและรับฟังอีเวนต์โดยใช้ EventDispatcher ของ Symfony คุณปฏิบัติ PHP Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน PHP Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน PHP Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “EventDispatcher: อีเวนต์แบบแยกส่วน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน PHP Academy นี้ได้ไหม
ได้ บทเรียน PHP Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- HttpFoundation: คำขอและการตอบกลับ
- คอนเทนเนอร์ DependencyInjection
- EventDispatcher: อีเวนต์แบบแยกส่วน
- คอมโพเนนต์คอนโซล: คำสั่ง CLI