การจัดการเหตุการณ์
webman/event
มีการจัดการเหตุการณ์ที่ละเอียดอ่อน ซึ่งทำให้สามารถดำเนินการบางอย่างตามลำดับธุรกิจได้โดยไม่ต้องส่งผลกระทบต่อโค้ด ทำให้สามารถแยกโมดูลธุรกิจออกจากกันได้ ในสถานการณ์ที่เป็นที่นิยม เช่น เมื่อผู้ใช้ใหม่ลงทะเบียนสำเร็จ เพียงแค่เผยแพร่เหตุการณ์ที่กำหนดเอง เช่น user.register
โมดูลต่าง ๆ จะได้รับเหตุการณ์นั้นและดำเนินการตามลำดับธุรกิจที่เกี่ยวข้อง
การติดตั้ง
composer require webman/event
การสมัครสมาชิกเหตุการณ์
การสมัครสมาชิกเหตุการณ์จะถูกกำหนดผ่านไฟล์ config/event.php
<?php
return [
'user.register' => [
[app\event\User::class, 'register'],
// ...ฟังก์ชันการจัดการเหตุการณ์อื่น ๆ...
],
'user.logout' => [
[app\event\User::class, 'logout'],
// ...ฟังก์ชันการจัดการเหตุการณ์อื่น ๆ...
]
];
คำอธิบาย:
user.register
user.logout
เป็นต้นเป็นชื่อเหตุการณ์ ประเภทสตริง แนะนำให้ใช้อักษรตัวเล็กและแบ่งด้วยจุด (.
)- เหตุการณ์หนึ่งสามารถมีฟังก์ชันการจัดการได้หลายฟังก์ชัน โดยลำดับการเรียกจะเป็นไปตามลำดับที่กำหนดในไฟล์
ฟังก์ชันการจัดการเหตุการณ์
ฟังก์ชันการจัดการเหตุการณ์สามารถเป็นวิธีในคลาส ฟังก์ชัน ฟังก์ชันปิด หรืออื่น ๆ
ตัวอย่างการสร้างคลาสจัดการเหตุการณ์ app/event/User.php
(หากไดเรกทอรีไม่อยู่กรุณาสร้างเอง)
<?php
namespace app\event;
class User
{
function register($user)
{
var_export($user);
}
function logout($user)
{
var_export($user);
}
}
การเผยแพร่เหตุการณ์
ใช้ Event::dispatch($event_name, $data);
หรือ Event::emit($event_name, $data);
เพื่อเผยแพร่เหตุการณ์ เช่น
<?php
namespace app\controller;
use support\Request;
use Webman\Event\Event;
class User
{
public function register(Request $request)
{
$user = [
'name' => 'webman',
'age' => 2
];
Event::dispatch('user.register', $user);
}
}
การเผยแพร่เหตุการณ์มีสองฟังก์ชันคือ Event::dispatch($event_name, $data);
และ Event::emit($event_name, $data);
ซึ่งมีพารามิเตอร์เหมือนกัน
ความแตกต่างคือ emit จะจับข้อผิดพลาดโดยอัตโนมัติ ซึ่งหมายความว่าหากเหตุการณ์มีฟังก์ชันการจัดการหลายฟังก์ชัน และฟังก์ชันใดฟังก์ชันหนึ่งเกิดข้อผิดพลาด จะไม่ส่งผลกระทบต่อการดำเนินการของฟังก์ชันการจัดการอื่น ๆ
ในขณะที่ dispatch จะไม่จับข้อผิดพลาดโดยอัตโนมัติ หากฟังก์ชันการจัดการใด ๆ ของเหตุการณ์นั้นเกิดข้อผิดพลาด จะหยุดการดำเนินการของฟังก์ชันการจัดการถัดไปและโยนข้อผิดพลาดขึ้นไปโดยตรง
คำแนะนำ
พารามิเตอร์$data
สามารถเป็นข้อมูลใด ๆ ได้ เช่น อาร์เรย์ อินสแตนซ์ของคลาส สตริง เป็นต้น
การฟังเหตุการณ์ด้วยอักขระแทน
การลงทะเบียนฟังแบบอักขระแทนอนุญาตให้คุณจัดการกับหลายเหตุการณ์ในตัวจัดฟังเดียวกัน เช่น ในไฟล์ config/event.php
ที่กำหนด
<?php
return [
'user.*' => [
[app\event\User::class, 'deal']
],
];
เราสามารถรับชื่อเหตุการณ์ที่เฉพาะเจาะจงผ่านพารามิเตอร์ที่สองของฟังก์ชันการจัดการเหตุการณ์ $event_data
<?php
namespace app\event;
class User
{
function deal($user, $event_name)
{
echo $event_name; // ชื่อเหตุการณ์ที่เฉพาะเจาะจง เช่น user.register user.logout เป็นต้น
var_export($user);
}
}
การหยุดการแพร่กระจายเหตุการณ์
เมื่อเราคืนค่า false
ในฟังก์ชันการจัดการเหตุการณ์ เหตุการณ์นี้จะหยุดการแพร่กระจาย
การจัดการเหตุการณ์ด้วยฟังก์ชันปิด
ฟังก์ชันการจัดการเหตุการณ์สามารถเป็นวิธีในคลาสหรือฟังก์ชันปิด เช่น
<?php
return [
'user.login' => [
function($user){
var_dump($user);
}
]
];
การดูเหตุการณ์และตัวจัดฟัง
ใช้คำสั่ง php webman event:list
เพื่อตรวจสอบเหตุการณ์และตัวจัดฟังทั้งหมดที่กำหนดในโครงการ
ขอบเขตการสนับสนุน
นอกจากโปรเจกต์หลักแล้ว ปลั๊กอินพื้นฐาน และ ปลั๊กอินแอปพลิเคชัน ก็รองรับการกำหนด event.php
เช่นกัน
ไฟล์การกำหนดของปลั๊กอินพื้นฐาน config/plugin/ผู้ผลิตปลั๊กอิน/ชื่อปลั๊กอิน/event.php
ไฟล์การกำหนดของปลั๊กอินแอปพลิเคชัน plugin/ชื่อปลั๊กอิน/config/event.php
ข้อควรระวัง
การจัดการเหตุการณ์ไม่ใช่แบบอะซิงโครนัส และไม่เหมาะสำหรับการจัดการธุรกิจที่ช้า ธุรกิจที่ช้าควรใช้การจัดการด้วยคิวข้อความ เช่น webman/redis-queue