การจัดการเหตุการณ์

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