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

webman/event ให้กลไกเหตุการณ์ที่ดีเยี่ยมที่สามารถทำให้เป็นไปได้โดยไม่บุกรุกในโค้ดให้ทำธุรกรรมธุรกิจบางอย่าง และทำให้โมดูลธุรกิจต่าง ๆ สามารถรับเหตุการณ์และดำเนินการธุรกิจที่เกี่ยวข้องได้

การติดตั้ง

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::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::emit('user.register', $user);
    }
}

เกริ่นนำ
พารามิเตอร์ $data ของ Event::emit($event_name, $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 เพื่อดูเหตุการณ์ที่กำหนดในโปรเจคและการฟังก์ชันจัดการเหตุการณ์

ข้อควรระวัง

การจัดการเหตุการณ์ไม่ได้เป็นแบบไม่สม่ำเสมอ การจัดการเหตุการณ์ไม่เหมาะสำหรับการจัดการธุรกิจที่ช้า ซึ่งควรใช้คิวข้อความในการจัดการเช่น webman/redis-queue