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

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