Symfony-তে Event Dispatcher একটি গুরুত্বপূর্ণ কম্পোনেন্ট, যা ইভেন্ট-ভিত্তিক প্রোগ্রামিং ধারণা অনুসরণ করে। ইভেন্ট ডিসপ্যাচার কম্পোনেন্ট আপনাকে ইভেন্টগুলিকে সিস্টেমের বিভিন্ন অংশে প্রেরণ করতে এবং শোনার সুযোগ দেয়, যা আপনার অ্যাপ্লিকেশনকে আরও ফ্লেক্সিবল এবং স্কেলেবল করে তোলে। Symfony ইভেন্ট-ভিত্তিক আর্কিটেকচার ব্যবহার করে একটি কমপ্লেক্স এবং শক্তিশালী ইভেন্ট সিস্টেম তৈরি করা হয়।
ইভেন্ট ডিসপ্যাচার কম্পোনেন্ট কী?
ইভেন্ট ডিসপ্যাচার হলো একটি কম্পোনেন্ট যা সিস্টেমের ইভেন্টগুলো পরিচালনা করে এবং উপযুক্ত লিসেনার বা সাবস্ক্রাইবার-কে সেই ইভেন্ট সম্পর্কে অবহিত করে। এতে Publisher-Subscriber Pattern অনুসরণ করা হয়, যেখানে Publisher ইভেন্ট ডিচার করে এবং Subscriber সেই ইভেন্টের উপর কাজ করে। এই প্যাটার্নে কোডের মডুলারিটি এবং অবজেক্টগুলোর মধ্যে ডিসকিপলিং নিশ্চিত হয়।
Event Dispatcher কম্পোনেন্টের মূল ধারণা
- ইভেন্ট:
একটি নির্দিষ্ট কার্যক্রম বা ঘটনা যা ঘটে এবং এটি অন্য অংশের কাছে জানানো হয়। যেমনঃ ইউজার লগইন, ফর্ম সাবমিট, ডাটাবেস আপডেট ইত্যাদি। - ইভেন্ট লিসেনার:
ইভেন্ট শোনার জন্য একটি ক্লাস বা মেথড যা নির্দিষ্ট ইভেন্টের জন্য রেজিস্টার করা থাকে এবং ইভেন্টটি ঘটলে কাজ করে। - ইভেন্ট সাবস্ক্রাইবার:
এটি একটি ক্লাস যা একাধিক ইভেন্ট শুনতে সক্ষম এবং স্বয়ংক্রিয়ভাবে সেগুলো হ্যান্ডেল করে। এটি লিসেনারের মতই কাজ করে কিন্তু এতে একাধিক ইভেন্টের জন্য কোড থাকে।
Event Dispatcher কিভাবে কাজ করে?
- ইভেন্ট তৈরি: প্রথমে একটি ইভেন্ট তৈরি করতে হবে, যা Event ক্লাসকে এক্সটেন্ড করে তৈরি করা হয়।
- ইভেন্ট ডিসপ্যাচ করা: যখন কোনো ইভেন্ট ঘটে, তখন সেটি ডিসপ্যাচ করা হয়, যা ইভেন্টটি শ্রোতা বা লিসেনারের কাছে পাঠায়।
- ইভেন্ট হ্যান্ডলিং: ইভেন্ট শোনার জন্য কোনো লিসেনার বা সাবস্ক্রাইবার রেজিস্টার করা থাকে, যেটি ইভেন্টটি শোনার পর নিজস্ব কার্যকলাপ শুরু করবে।
ইভেন্ট ডিসপ্যাচার কম্পোনেন্ট ব্যবহার করা
1. ইভেন্ট ক্লাস তৈরি করা
প্রথমে একটি কাস্টম ইভেন্ট ক্লাস তৈরি করতে হবে যা Event ক্লাসকে এক্সটেন্ড করবে। এটি আপনার ইভেন্টের ডেটা ধারণ করবে।
// src/Event/UserRegisteredEvent.php
namespace App\Event;
use Symfony\Contracts\EventDispatcher\Event;
class UserRegisteredEvent extends Event
{
public const NAME = 'user.registered';
protected $username;
public function __construct(string $username)
{
$this->username = $username;
}
public function getUsername(): string
{
return $this->username;
}
}
এখানে UserRegisteredEvent একটি কাস্টম ইভেন্ট ক্লাস যা username প্রপার্টি ধারণ করে এবং একটি কনস্ট্যান্ট NAME দিয়ে ইভেন্টের নাম নির্ধারণ করেছে।
2. ইভেন্ট ডিসপ্যাচ করা
আপনি যখন ইভেন্টটি ঘটাতে চান, তখন এটি EventDispatcherInterface এর মাধ্যমে ডিসপ্যাচ করা হয়।
// src/Controller/UserController.php
namespace App\Controller;
use App\Event\UserRegisteredEvent;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class UserController extends AbstractController
{
public function register(EventDispatcherInterface $eventDispatcher): Response
{
// ইউজার রেজিস্ট্রেশন লজিক
// ইভেন্ট তৈরি এবং ডিসপ্যাচ
$event = new UserRegisteredEvent('JohnDoe');
$eventDispatcher->dispatch($event, UserRegisteredEvent::NAME);
return new Response('User registered and event dispatched!');
}
}
এখানে, UserRegisteredEvent তৈরি করা হয়েছে এবং ইভেন্ট ডিসপ্যাচ করা হয়েছে dispatch() মেথডের মাধ্যমে।
3. ইভেন্ট লিসেনার তৈরি করা
এখন, একটি ইভেন্ট লিসেনার তৈরি করতে হবে যা ইভেন্টটি শোনবে এবং তার পরবর্তী পদক্ষেপ নেবে।
// src/EventListener/UserEventListener.php
namespace App\EventListener;
use App\Event\UserRegisteredEvent;
class UserEventListener
{
public function onUserRegistered(UserRegisteredEvent $event)
{
// ইভেন্টটি শোনা হয়েছে, কাজ করুন
$username = $event->getUsername();
// ডাটাবেসে লগ অথবা অন্য কোনো প্রসেস
}
}
4. ইভেন্ট লিসেনার কনফিগার করা
Symfony-তে ইভেন্ট লিসেনার কনফিগার করতে, এটি services.yaml ফাইলে করতে হয়।
# config/services.yaml
services:
App\EventListener\UserEventListener:
tags:
- { name: 'kernel.event_listener', event: 'user.registered', method: 'onUserRegistered' }
এখানে kernel.event_listener ট্যাগ ব্যবহার করে ইভেন্ট লিসেনার কনফিগার করা হয়েছে, এবং onUserRegistered মেথডটি ইভেন্ট শোনার জন্য রেজিস্টার করা হয়েছে।
ইভেন্ট সাবস্ক্রাইবার তৈরি করা
আপনি যদি একাধিক ইভেন্টের জন্য কোড হ্যান্ডেল করতে চান, তবে ইভেন্ট সাবস্ক্রাইবার ব্যবহার করতে পারেন।
// src/EventSubscriber/UserEventSubscriber.php
namespace App\EventSubscriber;
use App\Event\UserRegisteredEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class UserEventSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
UserRegisteredEvent::NAME => 'onUserRegistered',
];
}
public function onUserRegistered(UserRegisteredEvent $event)
{
// ইভেন্ট হ্যান্ডলিং লজিক
$username = $event->getUsername();
// লগিং বা অন্য কাজ
}
}
এখানে, getSubscribedEvents() মেথডের মাধ্যমে একাধিক ইভেন্ট শোনা যেতে পারে এবং onUserRegistered মেথড ব্যবহার করে ইভেন্ট হ্যান্ডল করা হয়।
সাবস্ক্রাইবার কনফিগার করা:
# config/services.yaml
services:
App\EventSubscriber\UserEventSubscriber:
tags:
- { name: 'kernel.event_subscriber' }
এখানে, kernel.event_subscriber ট্যাগ ব্যবহার করে সাবস্ক্রাইবার কনফিগার করা হয়েছে।
ইভেন্ট ডিসপ্যাচারের সুবিধা
- ডিকাপলিং:
ইভেন্ট ডিসপ্যাচার কম্পোনেন্ট ব্যবহার করে আপনার অ্যাপ্লিকেশনের বিভিন্ন অংশের মধ্যে সম্পর্ক কমানো যায়। উদাহরণস্বরূপ, ইউজার রেজিস্ট্রেশন ঘটানোর পর আপনি একাধিক কাজ (যেমন ইমেইল পাঠানো, লগিং) পৃথকভাবে করতে পারেন। - স্কেলেবিলিটি:
ইভেন্ট ড্রিভেন আর্কিটেকচার আপনার অ্যাপ্লিকেশনকে স্কেলেবল করে তোলে, কারণ নতুন ইভেন্ট এবং লিসেনার/সাবস্ক্রাইবার সহজে যোগ করা যায়। - ফ্লেক্সিবিলিটি:
ইভেন্ট হ্যান্ডলার/লিসেনার কোডকে পুনঃব্যবহারযোগ্য করে তোলে, এবং একাধিক ইভেন্ট একই বা আলাদা লোগিক চালাতে পারে।
সারাংশ
Symfony-এর Event Dispatcher কম্পোনেন্ট আপনাকে আপনার অ্যাপ্লিকেশনে ইভেন্ট এবং ইভেন্ট হ্যান্ডলিং লজিককে কার্যকরভাবে পরিচালনা করতে দেয়। এটি ইভেন্ট-ভিত্তিক আর্কিটেকচার ব্যবহার করে কোডের মডুলারিটি এবং স্কেলেবিলিটি বৃদ্ধি করে, যা বড় এবং জটিল অ্যাপ্লিকেশনে সাহায্য করে। Symfony ইভেন্ট ডিসপ্যাচার, লিসেনার এবং সাবস্ক্রাইবারের মাধ্যমে সহজেই ইভেন্ট ভিত্তিক কার্যক্রম বাস্তবায়ন করা যায়।