event ইভেন্ট পরিচালনা

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