ইভেন্ট পরিচালনা
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।