xử lý sự kiện

webman/event cung cấp một cơ chế sự kiện tinh vi, có thể thực hiện một số logic kinh doanh mà không làm gián đoạn mã nguồn, đạt được sự tách biệt giữa các mô-đun kinh doanh. Một kịch bản điển hình như khi một người dùng mới đăng ký thành công, chỉ cần phát một sự kiện tùy chỉnh như user.register, các mô-đun sẽ nhận được sự kiện đó và thực hiện logic kinh doanh tương ứng.

Cài đặt

composer require webman/event

Đăng ký sự kiện

Việc đăng ký sự kiện được cấu hình thống nhất thông qua tệp config/event.php

<?php
return [
    'user.register' => [
        [app\event\User::class, 'register'],
        // ...các hàm xử lý sự kiện khác...
    ],
    'user.logout' => [
        [app\event\User::class, 'logout'],
        // ...các hàm xử lý sự kiện khác...
    ]
];

Giải thích:

  • user.register, user.logout v.v. là tên sự kiện, kiểu chuỗi, khuyến nghị dùng chữ thường và phân tách bằng dấu chấm (.)
  • Một sự kiện có thể tương ứng với nhiều hàm xử lý sự kiện, thứ tự gọi theo thứ tự cấu hình

Hàm xử lý sự kiện

Hàm xử lý sự kiện có thể là bất kỳ phương thức lớp nào, hàm, hàm ẩn danh, v.v.
Ví dụ tạo lớp xử lý sự kiện app/event/User.php (nếu thư mục không tồn tại, hãy tự tạo)

<?php
namespace app\event;
class User
{
    function register($user)
    {
        var_export($user);
    }

    function logout($user)
    {
        var_export($user);
    }
}

Phát sự kiện

Sử dụng Event::dispatch($event_name, $data); hoặc Event::emit($event_name, $data); để phát sự kiện, ví dụ

<?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);
    }
}

Việc phát sự kiện có hai hàm, Event::dispatch($event_name, $data);Event::emit($event_name, $data); cả hai đều có tham số giống nhau.
Sự khác biệt là emit sẽ tự động bắt ngoại lệ bên trong, có nghĩa là nếu một sự kiện có nhiều hàm xử lý, một hàm xử lý xảy ra ngoại lệ sẽ không ảnh hưởng đến việc thực thi của các hàm xử lý khác.
Trong khi đó, dispatch sẽ không tự động bắt ngoại lệ, bất kỳ hàm xử lý nào của sự kiện hiện tại xảy ra ngoại lệ sẽ dừng việc thực thi hàm xử lý tiếp theo và ném ngoại lệ lên trên.

Lời khuyên
Tham số $data có thể là bất kỳ dữ liệu nào, ví dụ như mảng, thể hiện lớp, chuỗi, v.v.

Nghe sự kiện bằng ký tự đại diện

Việc đăng ký nghe ký tự đại diện cho phép bạn xử lý nhiều sự kiện trên cùng một bộ nghe, ví dụ cấu hình trong config/event.php

<?php
return [
    'user.*' => [
        [app\event\User::class, 'deal']
    ],
];

Chúng ta có thể lấy tên sự kiện cụ thể thông qua tham số thứ hai của hàm xử lý sự kiện $event_data

<?php
namespace app\event;
class User
{
    function deal($user, $event_name)
    {
        echo $event_name; // tên sự kiện cụ thể, chẳng hạn như user.register, user.logout, v.v.
        var_export($user);
    }
}

Dừng phát sóng sự kiện

Khi chúng tôi trả về false trong hàm xử lý sự kiện, sự kiện đó sẽ dừng phát sóng.

Hàm ẩn danh xử lý sự kiện

Hàm xử lý sự kiện có thể là phương thức của lớp, cũng có thể là hàm ẩn danh, ví dụ

<?php
return [
    'user.login' => [
        function($user){
            var_dump($user);
        }
    ]
];

Xem sự kiện và bộ nghe

Sử dụng lệnh php webman event:list để xem tất cả các sự kiện và bộ nghe được cấu hình trong dự án.

Phạm vi hỗ trợ

Ngoài các plugin chính plugin cơ bảnplugin ứng dụng, cũng hỗ trợ cấu hình event.php.
Tệp cấu hình plugin cơ bản config/plugin/nhà cung cấp/plugin/event.php
Tệp cấu hình plugin ứng dụng plugin/plugin/config/event.php

Lưu ý

Việc xử lý sự kiện không phải là bất đồng bộ, không phù hợp để xử lý các công việc chậm, công việc chậm nên sử dụng hàng đợi tin nhắn để xử lý, ví dụ webman/redis-queue