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