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-তে ইভেন্ট লিসেনার এবং সাবস্ক্রাইবার ব্যবহারের মাধ্যমে আপনি অ্যাপ্লিকেশনের ভেতরকার ইভেন্টগুলি পর্যবেক্ষণ করতে পারেন এবং সেগুলির জন্য কাস্টম লজিক প্রয়োগ করতে পারেন।