Symfony-তে Event Dispatcher এবং Listeners হল একটি অত্যন্ত শক্তিশালী এবং মডুলার সিস্টেম, যা অ্যাপ্লিকেশনের বিভিন্ন অংশের মধ্যে যোগাযোগ এবং কাস্টম ইভেন্ট হ্যান্ডলিং সহজ করে তোলে। এটি অ্যাপ্লিকেশনকে আরও নমনীয় এবং ডিকাপলড (decoupled) রাখে। Symfony-এর ইভেন্ট সিস্টেম Observer Design Pattern অনুসরণ করে, যেখানে একটি ইভেন্ট ডিসপ্যাচার ইভেন্টগুলিকে ট্রিগার করে এবং ইভেন্ট লিসেনাররা সেই ইভেন্টগুলোতে সাড়া দেয়।
ইভেন্ট ডিসপ্যাচার (Event Dispatcher)
Event Dispatcher একটি সিস্টেম যা ইভেন্টগুলি তৈরি এবং পরিচালনা করে। এটি নির্দিষ্ট ইভেন্ট বা কাস্টম ইভেন্ট ডিসপ্যাচ (trigger) করতে ব্যবহৃত হয় এবং সেই ইভেন্টগুলির জন্য লিসেনার বা সাবস্ক্রাইবারদের সরবরাহ করে।
ইভেন্ট ডিসপ্যাচারের কাজ:
- একটি নির্দিষ্ট ইভেন্টটি dispatch বা ট্রিগার করা হয়।
- ইভেন্ট লিসেনার বা সাবস্ক্রাইবার সেটি handle বা প্রসেস করে।
Symfony-তে EventDispatcher সিস্টেমের মাধ্যমে এই প্রক্রিয়া পরিচালিত হয়।
ইভেন্ট ডিসপ্যাচার কনফিগারেশন:
Symfony-তে ইভেন্ট ডিসপ্যাচার একটি Service হিসেবে কাজ করে, যা কাস্টম ইভেন্ট এবং লিসেনারদের ম্যানেজ করে।
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Contracts\EventDispatcher\Event;
$dispatcher = new EventDispatcher();
$dispatcher->dispatch(new Event(), 'custom.event');
এখানে EventDispatcher একটি ইভেন্ট custom.event ডিসপ্যাচ করেছে, যা এক বা একাধিক লিসেনারের দ্বারা হ্যান্ডল করা যেতে পারে।
ইভেন্ট লিসেনার (Event Listeners)
Event Listener একটি ক্লাস বা ফাংশন যা একটি নির্দিষ্ট ইভেন্টের জন্য কাজ করে। ইভেন্টটি ট্রিগার হওয়ার পর, লিসেনারটি সেই ইভেন্টটি হ্যান্ডল করে। সাধারণত ইভেন্ট লিসেনার কোনো নির্দিষ্ট controller বা service-এর অংশ হতে পারে।
ইভেন্ট লিসেনারের কাজ:
- একটি নির্দিষ্ট ইভেন্ট ট্রিগার হলে, লিসেনার সেই ইভেন্টের উপর নির্ধারিত কার্যপ্রণালী সম্পাদন করে।
ইভেন্ট লিসেনার কনফিগারেশন:
Symfony-তে ইভেন্ট লিসেনার কনফিগার করা হয় services.yaml ফাইলে, যেখানে ইভেন্ট এবং তার হ্যান্ডলার সংজ্ঞায়িত করা হয়।
services:
App\EventListener\CustomEventListener:
tags:
- { name: 'kernel.event_listener', event: 'custom.event', method: 'onCustomEvent' }
এখানে:
CustomEventListenerএকটি কাস্টম লিসেনার ক্লাস।eventইভেন্টের নাম, যার জন্য এটি কাজ করবে।methodহল ইভেন্ট হ্যান্ডলার মেথড।
কাস্টম ইভেন্ট লিসেনার ক্লাস উদাহরণ:
namespace App\EventListener;
use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\HttpKernel\Event\RequestEvent;
class CustomEventListener
{
public function onCustomEvent(Event $event)
{
// ইভেন্ট হ্যান্ডলিং লজিক এখানে
// উদাহরণস্বরূপ, লগিং, প্রক্রিয়াকরণ ইত্যাদি
echo 'Custom event triggered!';
}
}
এখানে onCustomEvent মেথডটি ইভেন্ট ট্রিগার হওয়ার পর কল হবে এবং কাস্টম লজিক কার্যকর করবে।
সাবস্ক্রাইবার এবং লিসেনার পার্থক্য
Subscriber এবং Listener-এর মধ্যে কিছু পার্থক্য রয়েছে:
| ফিচার | Listener | Subscriber |
|---|---|---|
| প্রধান উদ্দেশ্য | একটি নির্দিষ্ট ইভেন্ট হ্যান্ডল করা | একাধিক ইভেন্ট হ্যান্ডল করা |
| সংজ্ঞা | একটি নির্দিষ্ট ইভেন্টের জন্য একটি ক্লাস | একাধিক ইভেন্টের জন্য একটি ক্লাস |
| এটি কিভাবে কনফিগার হয় | services.yaml এ tags দ্বারা কনফিগার | EventSubscriberInterface ইমপ্লিমেন্ট করা |
| উদাহরণ | App\EventListener\MyEventListener | App\EventSubscriber\MyEventSubscriber |
ইভেন্ট সাবস্ক্রাইবার (Event Subscriber)
Event Subscriber হল একটি বিশেষ ধরনের ইভেন্ট লিসেনার যা একাধিক ইভেন্টের জন্য হ্যান্ডলার মেথড প্রদান করে। ইভেন্ট সাবস্ক্রাইবার একটি getSubscribedEvents মেথড ইমপ্লিমেন্ট করে, যা এটি কোন কোন ইভেন্ট শুনবে তা সংজ্ঞায়িত করে।
ইভেন্ট সাবস্ক্রাইবার কনফিগারেশন:
সাবস্ক্রাইবার ক্লাস উদাহরণ:
namespace App\EventSubscriber; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpKernel\Event\RequestEvent; class MyEventSubscriber implements EventSubscriberInterface { public static function getSubscribedEvents() { return [ 'kernel.request' => 'onRequest', 'custom.event' => 'onCustomEvent', ]; } public function onRequest(RequestEvent $event) { // handle request event echo 'Request event triggered!'; } public function onCustomEvent(Event $event) { // handle custom event echo 'Custom event triggered!'; } }সাবস্ক্রাইবার কনফিগারেশন:
services: App\EventSubscriber\MyEventSubscriber: tags: - { name: 'kernel.event_subscriber' }
এখানে, MyEventSubscriber সাবস্ক্রাইবারটি kernel.request এবং custom.event ইভেন্টগুলিকে সাবস্ক্রাইব করছে। প্রতিটি ইভেন্টে নির্ধারিত হ্যান্ডলিং মেথড কল হবে।
ইভেন্ট এবং লিসেনার/সাবস্ক্রাইবার ব্যবহার করার সুবিধা
- ডিকাপলিং (Decoupling): ইভেন্ট ডিসপ্যাচার এবং লিসেনার/সাবস্ক্রাইবার সিস্টেম ব্যবহার করে আপনি বিভিন্ন অংশের মধ্যে যোগাযোগ করতে পারেন, তবে এই অংশগুলি একে অপরের থেকে আলাদা থাকে। ফলে কোডের মডুলারিটি এবং রক্ষণাবেক্ষণ সহজ হয়।
- ডায়নামিক এবং কাস্টম লজিক:
আপনি সহজেই কাস্টম ইভেন্ট তৈরি করতে পারেন এবং এটি প্রয়োজন অনুসারে সাবস্ক্রাইবার বা লিসেনারের মাধ্যমে প্রক্রিয়া করতে পারেন। - বহু ইভেন্ট একযোগে ম্যানেজ করা:
সাবস্ক্রাইবার ব্যবহার করে একাধিক ইভেন্ট একত্রে হ্যান্ডেল করা যায়, যা কোডের পুনঃব্যবহারযোগ্যতা বাড়ায়। - প্রতিক্রিয়া এবং সাবস্ক্রিপশন:
একটি ইভেন্ট ট্রিগার হলে একাধিক সাবস্ক্রাইবারদের প্রতিক্রিয়া হ্যান্ডলিং করার সুবিধা থাকে।
সারাংশ
Symfony-এর Event Dispatcher এবং Listeners/Subscribers সিস্টেমের মাধ্যমে আপনি ইভেন্ট ট্রিগার এবং সেই ইভেন্টের জন্য প্রক্রিয়া বা প্রতিক্রিয়া (reaction) পরিচালনা করতে পারেন। এটি একটি শক্তিশালী এবং নমনীয় ডিজাইন প্যাটার্ন প্রদান করে, যা অ্যাপ্লিকেশনটির অংশগুলির মধ্যে শিথিল সংযোগ (loose coupling) বজায় রাখতে সাহায্য করে। Symfony ইভেন্ট সিস্টেম ব্যবহার করে, আপনি সহজে কাস্টম ইভেন্ট হ্যান্ডলিং এবং প্রসেসিং করতে পারেন, যা ডেভেলপমেন্টকে আরও শক্তিশালী এবং মডুলার করে তোলে।
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 ইভেন্ট ডিসপ্যাচার, লিসেনার এবং সাবস্ক্রাইবারের মাধ্যমে সহজেই ইভেন্ট ভিত্তিক কার্যক্রম বাস্তবায়ন করা যায়।
Symfony-তে ইভেন্ট লিসেনার এবং ইভেন্ট সাবস্ক্রাইবার দুটি গুরুত্বপূর্ণ কনসেপ্ট, যা আপনার অ্যাপ্লিকেশনে ইভেন্ট-ভিত্তিক কাজ পরিচালনা করতে সাহায্য করে। এই কনসেপ্টের মাধ্যমে আপনি অ্যাপ্লিকেশনের একাধিক কার্যকলাপ পর্যবেক্ষণ করতে পারেন এবং নির্দিষ্ট ইভেন্টের জন্য কাস্টম লজিক কার্যকর করতে পারেন।
ইভেন্ট-ভিত্তিক প্রোগ্রামিং
Symfony ইভেন্ট-ভিত্তিক প্রোগ্রামিং ব্যবহার করে আপনাকে অ্যাপ্লিকেশনের বিভিন্ন পর্যায়ে ঘটিত ইভেন্টগুলির উপর কার্যকলাপ নির্ধারণের সুযোগ দেয়। ইভেন্ট লিসেনার এবং সাবস্ক্রাইবার একে অপরকে পরিপূরক।
- ইভেন্ট লিসেনার (Event Listener): এটি একটি কাস্টম ক্লাস যা নির্দিষ্ট ইভেন্ট ট্রিগার হলে চালিত হয়। একটি ইভেন্টের জন্য কাস্টম কার্যকলাপ বা রেসপন্স সম্পাদন করে।
- ইভেন্ট সাবস্ক্রাইবার (Event Subscriber): এটি আরও শক্তিশালী এবং আধুনিক। এটি একাধিক ইভেন্টে সাবস্ক্রাইব করে এবং প্রতিটি ইভেন্টের জন্য কাস্টম কাজ পরিচালনা করতে পারে। সাবস্ক্রাইবার সাধারণত একাধিক ইভেন্টের জন্য সিঙ্ক্রোনাইজড কোড পরিচালনা করে।
ইভেন্ট লিসেনার তৈরি (Event Listener)
Symfony-তে ইভেন্ট লিসেনার তৈরি করতে আপনাকে একটি ক্লাস তৈরি করতে হবে, যা একটি নির্দিষ্ট ইভেন্ট শ্রেণীর উপর onEventName মেথড দ্বারা প্রতিক্রিয়া জানাবে।
ইভেন্ট লিসেনার উদাহরণ
ইভেন্ট লিসেনার ক্লাস তৈরি করুন:
প্রথমে একটি নতুন ক্লাস তৈরি করুন যা ইভেন্ট হ্যান্ডেল করবে।
উদাহরণ:
// src/EventListener/ExampleListener.php namespace App\EventListener; use Symfony\Component\HttpKernel\Event\RequestEvent; use Symfony\Component\HttpFoundation\Response; class ExampleListener { public function onKernelRequest(RequestEvent $event) { // ইভেন্টের জন্য কাস্টম কার্যকলাপ (যেমন: লগিং বা প্রিপ্রসেসিং) $request = $event->getRequest(); // এখানে ইভেন্টের জন্য কার্যকলাপ লিখুন // উদাহরণস্বরূপ, আমরা শুধু একটি সিম্পল টেক্সট রেসপন্স ফিরিয়ে দিচ্ছি $response = new Response('Request intercepted!'); $event->setResponse($response); } }ইভেন্ট লিসেনার কনফিগারেশন:
এরপরে, services.yaml ফাইলে লিসেনারটি রেজিস্টার করতে হবে, যাতে Symfony এটি ব্যবহার করতে পারে।
# config/services.yaml services: App\EventListener\ExampleListener: tags: - { name: 'kernel.event_listener', event: 'kernel.request', method: 'onKernelRequest' }এখানে:
- event:
'kernel.request'- যেটি Symfony-র একটি বিল্ট-ইন ইভেন্ট। - method:
'onKernelRequest'- যেখানে ইভেন্ট ট্রিগার হলে কাস্টম কার্যকলাপ সম্পন্ন হবে।
- event:
ইভেন্ট টেস্টিং:
এখন, যখনই kernel.request ইভেন্টটি ট্রিগার হবে,
ExampleListener::onKernelRequest()মেথডটি স্বয়ংক্রিয়ভাবে চালু হবে।
ইভেন্ট সাবস্ক্রাইবার তৈরি (Event Subscriber)
ইভেন্ট সাবস্ক্রাইবার আরও শক্তিশালী এবং পরিষ্কার উপায়ে একাধিক ইভেন্টে সাড়া দেয়। এটি একটি ইন্টারফেস EventSubscriberInterface ইমপ্লিমেন্ট করে এবং তার মধ্যে getSubscribedEvents() মেথড দ্বারা সাবস্ক্রাইব করা ইভেন্টের তালিকা প্রদান করে।
ইভেন্ট সাবস্ক্রাইবার উদাহরণ
ইভেন্ট সাবস্ক্রাইবার ক্লাস তৈরি করুন:
// src/EventSubscriber/ExampleSubscriber.php namespace App\EventSubscriber; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpKernel\Event\RequestEvent; use Symfony\Component\HttpFoundation\Response; class ExampleSubscriber implements EventSubscriberInterface { // ইভেন্ট লিস্ট এর জন্য সাবস্ক্রাইব করার জন্য মেথড public static function getSubscribedEvents(): array { return [ // ইভেন্ট এবং মেথড ম্যাপিং 'kernel.request' => 'onKernelRequest', 'kernel.response' => 'onKernelResponse', ]; } // kernel.request ইভেন্ট হ্যান্ডেল করার মেথড public function onKernelRequest(RequestEvent $event) { // কাস্টম কার্যকলাপ (যেমন: রিকোয়েস্ট লোগিং) $request = $event->getRequest(); // উদাহরণস্বরূপ: শুধুমাত্র একটি সিম্পল রেসপন্স প্রদান $response = new Response('Request processed by Subscriber!'); $event->setResponse($response); } // kernel.response ইভেন্ট হ্যান্ডেল করার মেথড public function onKernelResponse(ResponseEvent $event) { $response = $event->getResponse(); // রেসপন্সে কিছু পরিবর্তন করতে পারেন (যেমন: হেডার অ্যাড করা) $response->headers->set('X-Custom-Header', 'value'); } }ইভেন্ট সাবস্ক্রাইবার কনফিগারেশন:
সাবস্ক্রাইবারকে services.yaml ফাইলে রেজিস্টার করতে হবে।
# config/services.yaml services: App\EventSubscriber\ExampleSubscriber: tags: - { name: 'kernel.event_subscriber' }এখানে:
- kernel.event_subscriber ট্যাগ ব্যবহার করে Symfony এটি সাবস্ক্রাইবার হিসেবে চিহ্নিত করবে।
ইভেন্ট সাবস্ক্রাইবার টেস্টিং:
এখন, সাবস্ক্রাইবারটি
kernel.requestএবংkernel.responseইভেন্টগুলিতে সাড়া দেবে এবং সংশ্লিষ্ট কার্যকলাপ সম্পন্ন করবে।
ইভেন্ট লিসেনার এবং সাবস্ক্রাইবারের মধ্যে পার্থক্য
| বৈশিষ্ট্য | ইভেন্ট লিসেনার | ইভেন্ট সাবস্ক্রাইবার |
|---|---|---|
| অ্যাপ্লিকেশন | একটি নির্দিষ্ট ইভেন্টে সাড়া দেয় | একাধিক ইভেন্টে সাড়া দিতে পারে |
| এনগেজমেন্ট | একক ইভেন্টের জন্য ব্যবহৃত | একাধিক ইভেন্টে সক্রিয় |
| কনফিগারেশন | kernel.event_listener ট্যাগ | kernel.event_subscriber ট্যাগ |
| কোড রেটিং | সাধারণত কম | বেশি নমনীয় এবং আধুনিক, একাধিক ইভেন্টে সাড়া দেয় |
| সুবিধা | সহজ এবং স্পেসিফিক কার্যকলাপ | একাধিক ইভেন্টের জন্য কেন্দ্রীভূত কার্যকলাপ |
সারাংশ
- ইভেন্ট লিসেনার ব্যবহার করে আপনি একক একটি ইভেন্টের জন্য কার্যকলাপ নির্ধারণ করতে পারেন।
- ইভেন্ট সাবস্ক্রাইবার অনেক ইভেন্টের জন্য একই শ্রেণীতে একত্রিত কার্যকলাপ পরিচালনা করতে পারে এবং এটি Symfony-তে ইভেন্ট ব্যবস্থাপনাকে আরও সেন্ট্রালাইজড এবং রক্ষণাবেক্ষণযোগ্য করে তোলে।
- Symfony-তে ইভেন্ট লিসেনার এবং সাবস্ক্রাইবার ব্যবহারের মাধ্যমে আপনি অ্যাপ্লিকেশনের ভেতরকার ইভেন্টগুলি পর্যবেক্ষণ করতে পারেন এবং সেগুলির জন্য কাস্টম লজিক প্রয়োগ করতে পারেন।
Symfony একটি শক্তিশালী Event Dispatcher সিস্টেম সরবরাহ করে, যা ডেভেলপারদের অ্যাপ্লিকেশন এভেন্ট ভিত্তিক কার্যপ্রণালী পরিচালনা করতে সক্ষম করে। Symfony-এর বিল্ট-ইন ইভেন্টস এর মাধ্যমে, আপনি বিশেষ ইভেন্টগুলি শোনার এবং সেই ইভেন্টগুলির জন্য প্রতিক্রিয়া জানাতে পারেন, যা অ্যাপ্লিকেশনের আচরণ পরিবর্তন করতে বা কাস্টম লজিক প্রয়োগ করতে সহায়ক।
ইভেন্ট ড্রাইভেন আর্কিটেকচার
Symfony ইভেন্ট ড্রাইভেন আর্কিটেকচার ব্যবহার করে, যার মাধ্যমে অ্যাপ্লিকেশনের বিভিন্ন অংশ একটি নির্দিষ্ট ইভেন্ট এর জন্য অপেক্ষা করে এবং সেই ইভেন্টের ভিত্তিতে কার্যকরী পদক্ষেপ নেয়।
Symfony-এ ইভেন্ট কীভাবে কাজ করে?
- ইভেন্ট:
- ইভেন্ট হলো একটি ক্লাস, যা EventDispatcher এর মাধ্যমে ডিস্প্যাচ (পাঠানো) হয়। এটি অ্যাপ্লিকেশনের একটি নির্দিষ্ট ঘটনার প্রতিনিধিত্ব করে।
- লিসেনার:
- ইভেন্ট শুনে (listen) এবং ইভেন্ট ট্রিগার হলে প্রতিক্রিয়া জানানো হয়। Symfony-তে লিসেনার হলো সেই কোড যা একটি নির্দিষ্ট ইভেন্ট শোনে এবং তার জন্য একটি কার্যকরী পদক্ষেপ নেয়।
- ডিস্প্যাচ:
- ইভেন্টটি ডিপেন্ডেন্ট ক্লাসের মাধ্যমে ডিস্প্যাচ করা হয়, যাতে লিসেনার বা সাবস্ক্রাইবার সেই ইভেন্টটি গ্রহণ করতে পারে।
Symfony-এ বিল্ট-ইন ইভেন্ট উদাহরণ
Symfony বিভিন্ন বিল্ট-ইন ইভেন্ট সরবরাহ করে, যা আপনি EventListener বা EventSubscriber ব্যবহার করে শুনতে পারেন।
১. Kernel Request ইভেন্ট
kernel.requestইভেন্টটি যখন HTTP অনুরোধ আসে, তখন ট্রিগার হয়। এটি অ্যাপ্লিকেশনের আর্কিটেকচারের প্রথম অংশ এবং ইনপুট ডেটা প্রসেস করার জন্য ব্যবহার করা হয়।
উদাহরণ (Kernel Request Listener):
namespace App\EventListener;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class RequestListener implements EventSubscriberInterface
{
public function onKernelRequest(RequestEvent $event)
{
// এখানে আপনার কাস্টম লজিক যোগ করুন
// উদাহরণস্বরূপ, কাস্টম হেডার চেক করা
$request = $event->getRequest();
if (!$request->headers->has('X-Custom-Header')) {
// কাস্টম হেডার না থাকলে একটি কাস্টম 400 এর রেসপন্স তৈরি করুন
$response = new Response('Custom header is missing.', 400);
$event->setResponse($response);
}
}
public static function getSubscribedEvents()
{
// যখন kernel.request ইভেন্ট হয়, তখন আমাদের কাস্টম লজিক চলে
return [
KernelEvents::REQUEST => 'onKernelRequest',
];
}
}
- ব্যাখ্যা:
- এখানে
onKernelRequestমেথডটিkernel.requestইভেন্টটি শোনে। - যদি
X-Custom-Headerনামের হেডার অনুপস্থিত থাকে, তবে একটি কাস্টম 400 রেসপন্স তৈরি হয় এবং সেটি ফেরত দেওয়া হয়।
- এখানে
২. Kernel Controller ইভেন্ট
kernel.controllerইভেন্টটি যখন Symfony কন্ট্রোলার কল করা হয়, তখন ট্রিগার হয়। আপনি কন্ট্রোলার লজিকের আগে কিছু কার্যকরী পদক্ষেপ নিতে পারেন।
উদাহরণ (Controller Listener):
namespace App\EventListener;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ControllerListener implements EventSubscriberInterface
{
public function onKernelController(ControllerEvent $event)
{
// Controller চেক করতে পারেন
$controller = $event->getController();
if (is_array($controller)) {
// Controller method অনুযায়ী custom logic প্রয়োগ করা
$controller[0]->setCustomHeader('Value');
}
}
public static function getSubscribedEvents()
{
return [
KernelEvents::CONTROLLER => 'onKernelController',
];
}
}
- ব্যাখ্যা:
- এখানে,
onKernelControllerমেথডটিkernel.controllerইভেন্টটি শোনে। - কন্ট্রোলার কল হওয়ার আগে আপনি কাস্টম লজিক প্রয়োগ করতে পারেন। উদাহরণস্বরূপ, কন্ট্রোলার মেথডের জন্য কাস্টম হেডার সেট করা।
- এখানে,
৩. Response ইভেন্ট
kernel.responseইভেন্টটি যখন Symfony একটি HTTP রেসপন্স তৈরি করে, তখন এটি ট্রিগার হয়। এটি রেসপন্সের আগে কাস্টম ম্যানিপুলেশন করতে সাহায্য করে।
উদাহরণ (Response Listener):
namespace App\EventListener;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ResponseListener implements EventSubscriberInterface
{
public function onKernelResponse(ResponseEvent $event)
{
$response = $event->getResponse();
// কাস্টম হেডার যোগ করা
$response->headers->set('X-Processed-Time', (new \DateTime())->format('Y-m-d H:i:s'));
}
public static function getSubscribedEvents()
{
return [
KernelEvents::RESPONSE => 'onKernelResponse',
];
}
}
- ব্যাখ্যা:
onKernelResponseমেথডটিkernel.responseইভেন্টটি শোনে।- রেসপন্স তৈরি হওয়ার পরে কাস্টম হেডার যোগ করা হয়। উদাহরণস্বরূপ, X-Processed-Time হেডার যুক্ত করা হয়েছে।
৪. Exception ইভেন্ট
kernel.exceptionইভেন্টটি যখন কোনো এক্সসেপশন ঘটে, তখন ট্রিগার হয়। এটি অ্যাপ্লিকেশনে এক্সসেপশন হ্যান্ডলিং এর জন্য ব্যবহৃত হয়।
উদাহরণ (Exception Listener):
namespace App\EventListener;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ExceptionListener implements EventSubscriberInterface
{
public function onKernelException(ExceptionEvent $event)
{
$exception = $event->getThrowable();
// কাস্টম এক্সসেপশন হ্যান্ডলিং
if ($exception instanceof \App\Exception\CustomException) {
$response = new Response('Custom error occurred', 500);
$event->setResponse($response);
}
}
public static function getSubscribedEvents()
{
return [
KernelEvents::EXCEPTION => 'onKernelException',
];
}
}
- ব্যাখ্যা:
onKernelExceptionমেথডটিkernel.exceptionইভেন্টটি শোনে।- একটি কাস্টম এক্সসেপশন ঘটলে, সিস্টেমের ডিফল্ট এক্সসেপশন হ্যান্ডলিং পরিবর্তন করে কাস্টম রেসপন্স ফেরত দেয়।
Symfony-তে ইভেন্টগুলো পরিচালনা করা
- Event Listener: ইভেন্ট শোনার জন্য আপনি EventListener ক্লাস তৈরি করতে পারেন, যা একটি নির্দিষ্ট ইভেন্টের জন্য লিসেনার মেথডকে কনফিগার করে।
- Event Subscriber: ইভেন্ট সাবস্ক্রাইবার Symfony-এ আরও উন্নত ফিচার প্রদান করে, কারণ এটি একাধিক ইভেন্টের জন্য শোনার ক্ষমতা দেয়। এইটি
getSubscribedEventsমেথডের মাধ্যমে কাজ করে।
সারাংশ
Symfony-তে বিল্ট-ইন ইভেন্টস ও Event Dispatcher সিস্টেম আপনাকে ইভেন্ট-ভিত্তিক প্রোগ্রামিং পরিচালনা করতে সাহায্য করে। এটি বিভিন্ন অ্যাপ্লিকেশন স্তরে কার্যপ্রণালী পরিচালনা, এক্সসেপশন হ্যান্ডলিং, এবং কাস্টম লজিক প্রয়োগের জন্য খুবই উপযোগী। Symfony-তে ইভেন্টগুলি ব্যবহার করে, আপনি অ্যাপ্লিকেশনটির আচরণ সহজেই কাস্টমাইজ করতে এবং এক্সটেন্ড করতে পারেন।
Symfony-তে কাস্টম ইভেন্টস ব্যবহারের মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনে ইভেন্ট ড্রিভেন আর্কিটেকচার (Event-Driven Architecture) প্রয়োগ করতে পারেন। এটি অ্যাপ্লিকেশনের বিভিন্ন অংশের মধ্যে ডিকাপলিং নিশ্চিত করে, যেখানে এক অংশে কোনো পরিবর্তন বা ক্রিয়া ঘটলে অন্য অংশে তা স্বয়ংক্রিয়ভাবে প্রতিক্রিয়া জানায়।
Symfony এর Event Dispatcher সিস্টেম ইভেন্টস এবং লিসেনারসের মাধ্যমে ইভেন্টগুলি পরিচালনা করে। কাস্টম ইভেন্টস ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশনে নতুন ইভেন্ট তৈরি করতে পারেন এবং যখনই এই ইভেন্টটি ট্রিগার হবে, সংশ্লিষ্ট লিসেনারস কাজ করবে।
Symfony-তে কাস্টম ইভেন্টস তৈরি করা
Symfony-তে কাস্টম ইভেন্ট তৈরি করার জন্য আপনাকে তিনটি প্রধান পদক্ষেপ অনুসরণ করতে হবে:
- ইভেন্ট ক্লাস তৈরি করা
- ইভেন্ট ডিপ্যাচার (Event Dispatcher) ব্যবহার করা
- ইভেন্ট লিসেনার তৈরি করা
1. ইভেন্ট ক্লাস তৈরি করা
প্রথমে, একটি কাস্টম ইভেন্ট ক্লাস তৈরি করতে হবে যা Symfony\Component\EventDispatcher\Event ক্লাসের উপর ভিত্তি করে তৈরি হবে। এই ক্লাসে ইভেন্টের জন্য প্রয়োজনীয় তথ্য বা ডেটা থাকবে, যা ইভেন্ট ট্রিগার হওয়ার সময় পাস করা হবে।
ইভেন্ট ক্লাস উদাহরণ:
namespace App\Event;
use Symfony\Contracts\EventDispatcher\Event;
class ProductCreatedEvent extends Event
{
public const NAME = 'product.created';
private $product;
public function __construct($product)
{
$this->product = $product;
}
public function getProduct()
{
return $this->product;
}
}
এখানে:
ProductCreatedEventক্লাসটি একটি কাস্টম ইভেন্ট যাEventক্লাস থেকে এক্সটেন্ড করা হয়েছে।$productভেরিয়েবলটি পণ্য সম্পর্কিত ডেটা ধারণ করে, যা ইভেন্টে পাস করা হবে।NAMEকনস্ট্যান্টটি ইভেন্টের নাম সংরক্ষণ করে, যা পরে ইভেন্ট ট্রিগার করার জন্য ব্যবহার করা হবে।
2. ইভেন্ট ডিপ্যাচার ব্যবহার করা
ইভেন্ট dispatch (ট্রিগার) করার জন্য, EventDispatcherInterface ব্যবহার করতে হবে। ইভেন্ট ডিপ্যাচার কাস্টম ইভেন্টটি ট্রিগার করার জন্য ব্যবহৃত হয়।
ইভেন্ট ট্রিগার করার উদাহরণ:
namespace App\Controller;
use App\Event\ProductCreatedEvent;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\Response;
class ProductController extends AbstractController
{
public function create(EventDispatcherInterface $eventDispatcher): Response
{
// নতুন পণ্য তৈরি
$product = ['name' => 'Product 1', 'price' => 100];
// কাস্টম ইভেন্ট তৈরি এবং ডিপ্যাচ করা
$event = new ProductCreatedEvent($product);
$eventDispatcher->dispatch($event, ProductCreatedEvent::NAME);
return new Response('Product Created');
}
}
এখানে:
- EventDispatcherInterface Symfony-এর ইভেন্ট ডিপ্যাচ করার জন্য ব্যবহৃত হয়।
- $eventDispatcher->dispatch($event, ProductCreatedEvent::NAME) এই লাইনটি কাস্টম ইভেন্ট ট্রিগার করে এবং ইভেন্টের সাথে সংশ্লিষ্ট ডেটা পাঠায়।
3. ইভেন্ট লিসেনার তৈরি করা
ইভেন্ট লিসেনার এমন একটি ক্লাস যা নির্দিষ্ট ইভেন্টের প্রতিক্রিয়া জানায়। ইভেন্ট লিসেনার শ্রবণ করে, যখন নির্দিষ্ট ইভেন্ট ট্রিগার হয়, তখন এটি ইভেন্টে সংযুক্ত কাস্টম লজিক কার্যকর করে।
ইভেন্ট লিসেনার উদাহরণ:
namespace App\EventListener;
use App\Event\ProductCreatedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ProductCreatedListener implements EventSubscriberInterface
{
public function onProductCreated(ProductCreatedEvent $event)
{
$product = $event->getProduct();
// এখানে আপনি কাস্টম লজিক যুক্ত করতে পারেন, যেমন ইমেইল পাঠানো
echo "Product Created: " . $product['name'];
}
public static function getSubscribedEvents()
{
return [
ProductCreatedEvent::NAME => 'onProductCreated',
];
}
}
এখানে:
onProductCreated()মেথডটি ইভেন্টের উপর প্রতিক্রিয়া জানায়। যখনProductCreatedEvent::NAMEইভেন্টটি ডিপ্যাচ করা হবে, তখন এই মেথডটি চালু হবে।getSubscribedEvents()মেথডটি ইভেন্টের নাম এবং লিসেনারের মেথড মানচিত্র তৈরি করে।
4. লিসেনার রেজিস্টার করা
Symfony-তে ইভেন্ট লিসেনারটি সঠিকভাবে কাজ করতে services.yaml ফাইলে রেজিস্টার করতে হবে।
services.yaml ফাইলে লিসেনার রেজিস্টার করা:
services:
App\EventListener\ProductCreatedListener:
tags:
- { name: 'kernel.event_subscriber' }
এটি ProductCreatedListener ক্লাসকে Symfony-এর ইভেন্ট সিস্টেমের সাথে যুক্ত করে, যাতে এটি ProductCreatedEvent ইভেন্টের প্রতি সাড়া দিতে পারে।
ইভেন্টে ডেটা প্রেরণ এবং প্রতিক্রিয়া
একবার কাস্টম ইভেন্টটি ডিপ্যাচ করা হলে, সংশ্লিষ্ট ইভেন্ট লিসেনার সেই ইভেন্টটি গ্রহণ করবে এবং প্রেরিত ডেটার উপর ভিত্তি করে প্রয়োজনীয় কার্যকলাপ সম্পাদন করবে। উদাহরণস্বরূপ, পণ্য তৈরি হলে আপনি একটি ইমেইল পাঠানো, লগ তৈরি করা অথবা অন্য অ্যাকশন নিতে পারেন।
ইভেন্ট ডিপ্যাচ এবং লিসেনার কাস্টমাইজেশন
Symfony ইভেন্ট সিস্টেমের শক্তি হলো এর কাস্টমাইজেশন ক্ষমতা। আপনি যেকোনো ইভেন্ট তৈরি করতে পারেন এবং আপনার অ্যাপ্লিকেশনের যেকোনো অংশে এটি ব্যবহার করতে পারেন। এটি ইভেন্ট ড্রিভেন আর্কিটেকচারের মাধ্যমে অ্যাপ্লিকেশনের ভিন্ন ভিন্ন অংশের মধ্যে যোগাযোগ নিশ্চিত করে।
সারাংশ
- Symfony ইভেন্ট ড্রিভেন আর্কিটেকচার ব্যবহার করে আপনি কাস্টম ইভেন্ট তৈরি করতে পারেন যা আপনার অ্যাপ্লিকেশনের কার্যপ্রণালীকে আরও নমনীয় এবং মডুলার করে।
- EventDispatcher কাস্টম ইভেন্ট ট্রিগার করে, এবং EventListener সেই ইভেন্টের প্রতি প্রতিক্রিয়া জানায়।
- Symfony-তে ইভেন্ট ব্যবহারের মাধ্যমে আপনি ডিকাপলিং নিশ্চিত করতে পারেন এবং কোডের রিডেবিলিটি ও মেইনটেনিবিলিটি বাড়াতে পারেন।
Symfony-তে কাস্টম ইভেন্টস ব্যবহারের মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনটিকে আরও ফ্লেক্সিবল, ডাইনামিক এবং স্কেলেবল করতে পারেন।
Read more