Zend Framework (এখন Laminas) এর ইভেন্ট-ভিত্তিক আর্কিটেকচার আপনাকে অ্যাপ্লিকেশনটির বিভিন্ন অংশে ইভেন্ট হ্যান্ডলার ব্যবহার করে নির্দিষ্ট কাজ করতে সহায়তা করে। ইভেন্ট সিস্টেম অ্যাপ্লিকেশনের কার্যাবলীকে একে অপর থেকে আলাদা করে, যাতে ডিপেনডেন্সি কম থাকে এবং কোডের পুনঃব্যবহারযোগ্যতা বাড়ে।
Zend Framework এ ইভেন্ট সিস্টেম মূলত দুইটি অংশে বিভক্ত: ইভেন্ট এবং ইভেন্ট লিসেনার। যখন একটি নির্দিষ্ট ঘটনা (ইভেন্ট) ঘটে, তখন সেই ইভেন্টের সাথে সম্পর্কিত লিসেনার কার্যকর হয় এবং নির্দিষ্ট কার্যাবলী সম্পন্ন করে।
১. ইভেন্ট সিস্টেমের মৌলিক ধারণা
Zend Framework বা Laminas এ ইভেন্ট সিস্টেমের মাধ্যমে আপনি ইভেন্ট তৈরি করতে পারেন, এবং সেগুলোর জন্য লিসেনার (event listener) লিখতে পারেন। যখন নির্দিষ্ট একটি ইভেন্ট ঘটবে, তখন লিসেনারটি চালু হবে এবং ইভেন্টের জন্য নির্ধারিত কোড কার্যকর হবে।
২. ইভেন্ট তৈরি করা
প্রথমে আপনাকে একটি ইভেন্ট তৈরি করতে হবে। উদাহরণস্বরূপ, আমরা একটি UserRegistered ইভেন্ট তৈরি করব, যা তখন ঘটবে যখন একটি নতুন ইউজার সাইন আপ করবে।
১.1. ইভেন্ট ক্লাস তৈরি
এখানে একটি সাধারণ UserRegistered ইভেন্ট ক্লাস তৈরি করা হয়েছে:
ফোল্ডার স্ট্রাকচার:
module/Application/src/Event/UserRegistered.php
UserRegistered.php:
<?php
namespace Application\Event;
use Laminas\EventManager\Event;
class UserRegistered extends Event
{
const EVENT_NAME = 'user.registered';
protected $userData;
public function __construct($userData)
{
$this->userData = $userData;
}
public function getUserData()
{
return $this->userData;
}
}
এখানে UserRegistered ক্লাসটি একটি ইভেন্ট যা userData (যেমন ইউজারের নাম, ইমেইল) ধারণ করবে।
৩. ইভেন্ট লিসেনার তৈরি করা
এখন আপনাকে একটি লিসেনার তৈরি করতে হবে, যা UserRegistered ইভেন্টের ঘটার পর কাজ করবে। উদাহরণস্বরূপ, আমরা একটি মেইল সিস্টেমের লিসেনার তৈরি করতে পারি, যা ইউজার রেজিস্ট্রেশন হওয়ার পর একটি ধন্যবাদ ইমেইল পাঠাবে।
৩.1. মেইল সিস্টেম লিসেনার তৈরি
ফোল্ডার স্ট্রাকচার:
module/Application/src/EventListener/SendWelcomeEmailListener.php
SendWelcomeEmailListener.php:
<?php
namespace Application\EventListener;
use Application\Event\UserRegistered;
class SendWelcomeEmailListener
{
public function onUserRegistered(UserRegistered $event)
{
// ইউজারের ডাটা নিয়ে ইমেইল পাঠানোর কার্যক্রম
$userData = $event->getUserData();
echo 'Sending welcome email to ' . $userData['email'] . "\n";
// এখানে আপনি মেইল পাঠানোর জন্য কোড লিখতে পারেন
}
}
এখানে SendWelcomeEmailListener ক্লাসটি onUserRegistered মেথডের মাধ্যমে UserRegistered ইভেন্টের জন্য কাজ করবে এবং ইমেইল পাঠানোর কার্যক্রম সম্পন্ন করবে।
৪. ইভেন্ট এবং লিসেনার রেজিস্টার করা
এখন আমাদের তৈরি করা ইভেন্ট এবং লিসেনারকে অ্যাপ্লিকেশনে রেজিস্টার করতে হবে, যাতে তারা একে অপরের সাথে ইন্টারঅ্যাক্ট করতে পারে।
৪.1. module.config.php এ ইভেন্ট রেজিস্ট্রেশন
এটি করার জন্য, আমাদের মডিউল কনফিগারেশনে ইভেন্ট এবং লিসেনারকে রেজিস্টার করতে হবে।
ফোল্ডার স্ট্রাকচার:
module/Application/config/module.config.php
module.config.php:
<?php
namespace Application;
use Application\EventListener\SendWelcomeEmailListener;
use Application\Event\UserRegistered;
use Laminas\Mvc\MvcEvent;
return [
'controllers' => [
'invokables' => [
'Application\Controller\Index' => 'Application\Controller\IndexController',
],
],
'service_manager' => [
'factories' => [
SendWelcomeEmailListener::class => function ($container) {
return new SendWelcomeEmailListener();
},
],
],
'event_manager' => [
'listeners' => [
UserRegistered::EVENT_NAME => [
SendWelcomeEmailListener::class,
],
],
],
'router' => [
'routes' => [
'home' => [
'type' => 'Literal',
'options' => [
'route' => '/',
'defaults' => [
'controller' => 'Application\Controller\Index',
'action' => 'index',
],
],
],
],
],
];
এখানে আমরা SendWelcomeEmailListener ক্লাসটিকে service_manager এ রেজিস্টার করেছি এবং event_manager এর মধ্যে UserRegistered::EVENT_NAME ইভেন্টের জন্য এই লিসেনারটি যুক্ত করেছি।
৫. কন্ট্রোলারে ইভেন্ট ডিসপ্যাচ করা
এখন আমাদের কন্ট্রোলারে UserRegistered ইভেন্টটি ডিসপ্যাচ করতে হবে। উদাহরণস্বরূপ, আমরা একটি registerAction তৈরি করব, যেখানে ইউজার রেজিস্ট্রেশন হবে এবং পরবর্তী ইভেন্ট ট্রিগার হবে।
৫.1. কন্ট্রোলারে ইভেন্ট ট্রিগার করা
ফোল্ডার স্ট্রাকচার:
module/Application/src/Controller/IndexController.php
IndexController.php:
<?php
namespace Application\Controller;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
use Application\Event\UserRegistered;
class IndexController extends AbstractActionController
{
public function registerAction()
{
// ইউজারের ডাটা সংগ্রহ
$userData = [
'name' => 'John Doe',
'email' => 'john.doe@example.com',
];
// ইউজার রেজিস্ট্রেশন ইভেন্ট ডিসপ্যাচ করা
$event = new UserRegistered($userData);
$this->getEventManager()->trigger(UserRegistered::EVENT_NAME, $this, $event);
return new ViewModel();
}
}
এখানে registerAction মেথডে আমরা একটি UserRegistered ইভেন্ট তৈরি করেছি এবং getEventManager()->trigger() মেথডের মাধ্যমে ইভেন্টটি ডিসপ্যাচ করেছি।
৬. ইভেন্টের কার্যকরী পরীক্ষা
এখন আপনি যখন /register রাউটে নেভিগেট করবেন, তখন UserRegistered ইভেন্টটি ট্রিগার হবে এবং লিসেনারটি কাজ করবে। আমাদের উদাহরণে, লিসেনারটি "Sending welcome email to john.doe@example.com" মেসেজটি প্রদর্শন করবে (যদিও এখানে শুধু ইমেইল পাঠানোর সিমুলেশন করা হয়েছে, বাস্তবে এটি মেইল সিস্টেমের সাথে ইন্টিগ্রেট করতে হবে)।
সারাংশ
Zend Framework বা Laminas এর ইভেন্ট সিস্টেম ব্যবহার করে আপনি অ্যাপ্লিকেশনের বিভিন্ন অংশে কাজগুলো পৃথকভাবে পরিচালনা করতে পারেন। যখন কোনো নির্দিষ্ট ঘটনা ঘটে, তখন একটি ইভেন্ট ট্রিগার করা হয় এবং সংশ্লিষ্ট লিসেনারটি কাজ করে। এই সিস্টেমটি আপনাকে অ্যাপ্লিকেশনের কোড সঠিকভাবে মডুলার এবং পুনঃব্যবহারযোগ্য করতে সহায়তা করে।
Read more