Symfony ফ্রেমওয়ার্কের Dependency Injection (DI) সিস্টেম অ্যাপ্লিকেশনের সার্ভিসগুলির মধ্যে নির্ভরতা ম্যানেজ করতে সাহায্য করে। সার্ভিস ট্যাগস এবং কম্পাইলার পাসেস Symfony-এর Dependency Injection Container (DIC) ব্যবস্থার গুরুত্বপূর্ণ অংশ, যা সার্ভিসদের কাস্টম আচরণ এবং নির্ভরতা পরিচালনা করতে ব্যবহৃত হয়। এগুলো আপনার অ্যাপ্লিকেশনকে আরও মডুলার, কাস্টমাইজযোগ্য এবং স্কেলেবল করতে সহায়ক।
সার্ভিস ট্যাগস (Service Tags)
Service Tags Symfony সার্ভিস কনটেইনারের মধ্যে একটি বিশেষ চিহ্ন, যা সার্ভিসগুলোকে অতিরিক্ত কাস্টম ফাংশনালিটি বা আচরণ প্রদান করতে ব্যবহৃত হয়। আপনি যখন একটি সার্ভিস তৈরি করেন, তখন আপনি সেটিকে একটি বা একাধিক ট্যাগ অ্যাসাইন করতে পারেন। এই ট্যাগগুলো পরে সার্ভিসগুলোকে কাস্টম প্রসেসিং বা আচরণ (যেমন, ইভেন্ট লিস্টেনিং, কাস্টম লোগিং, অথবা অ্যাসার্ট ইনস্ট্যান্স) প্রয়োগ করতে ব্যবহৃত হয়।
ট্যাগ ব্যবহার কেন?
- কাস্টম লজিক: বিশেষ সার্ভিসগুলোতে কাস্টম লজিক যোগ করতে সাহায্য করে।
- প্রসেসিং: একটি সার্ভিসের উপর ভিত্তি করে অন্যান্য সার্ভিসগুলিকে প্রসেস বা প্রক্রিয়া করতে সাহায্য করে।
- ফ্লেক্সিবিলিটি: সার্ভিসগুলোর আচরণ এক্সটেন্ড বা পরিবর্তন করা সহজ করে।
ট্যাগ ব্যবহার করার উদাহরণ
- services.yaml:
services:
App\Service\MyService:
tags:
- { name: 'app.my_custom_tag' }
এখানে App\Service\MyService সার্ভিসে app.my_custom_tag নামক একটি ট্যাগ অ্যাসাইন করা হয়েছে। এরপর এই সার্ভিসের জন্য কাস্টম লজিক প্রয়োগ করা যাবে।
- কাস্টম ট্যাগ প্রসেসিং:
এখন, Symfony এর Event Subscriber বা Compiler Pass ব্যবহার করে app.my_custom_tag ট্যাগ সহ সার্ভিসগুলো প্রসেস করা যেতে পারে।
namespace App\DependencyInjection\Compiler;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
class MyCustomTagCompilerPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
// সার্ভিস কনটেইনারে 'app.my_custom_tag' ট্যাগ সহ সার্ভিসগুলো খুঁজে বের করা
$taggedServices = $container->findTaggedServiceIds('app.my_custom_tag');
foreach ($taggedServices as $id => $tags) {
$definition = $container->getDefinition($id);
// কাস্টম লজিক অ্যাড করা
}
}
}
এখানে, MyCustomTagCompilerPass ট্যাগের মাধ্যমে সার্ভিসগুলোর উপর কাস্টম প্রক্রিয়া প্রয়োগ করবে।
কম্পাইলার পাসেস (Compiler Passes)
Compiler Passes Symfony-তে DependencyInjection কনটেইনারে সার্ভিস কনফিগারেশন পরিবর্তন করার জন্য ব্যবহৃত হয়। কম্পাইলার পাস সার্ভিস ডিফিনিশনগুলি তৈরি হওয়ার পরে এবং কনটেইনার কম্পাইল হওয়ার আগে চালানো হয়। এটি আপনাকে সার্ভিস কনফিগারেশনের উপর কাস্টম পরিবর্তন করার অনুমতি দেয়।
কম্পাইলার পাস ব্যবহার কেন?
- সার্ভিস ডিফিনিশন মডিফাই করা: সার্ভিস কনটেইনার কম্পাইল হওয়ার আগে সার্ভিসের ডিফিনিশন পরিবর্তন করা।
- নতুন সার্ভিস যুক্ত করা: সার্ভিস কনটেইনারে নতুন সার্ভিস বা ডিপেন্ডেন্সি যোগ করা।
- কম্পাইল প্রক্রিয়ায় ম্যানিপুলেশন: কনটেইনার কম্পাইল হওয়ার পর কাস্টম প্রক্রিয়া প্রয়োগ করা।
কম্পাইলার পাস উদাহরণ
- services.yaml ফাইলে কম্পাইলার পাস অ্যাড করা:
services:
App\DependencyInjection\Compiler\MyCustomCompilerPass:
tags:
- { name: 'kernel.event_listener' }
- কম্পাইলার পাস ক্লাস তৈরি:
namespace App\DependencyInjection\Compiler;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
class MyCustomCompilerPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
// সার্ভিসে পরিবর্তন করা
$definition = $container->getDefinition('my_service');
$definition->addMethodCall('setCustomDependency', [new Reference('another_service')]);
}
}
এখানে, MyCustomCompilerPass ক্লাসের মাধ্যমে my_service সার্ভিসের ডিফিনিশন পরিবর্তন করা হয়েছে এবং একটি নতুন ডিপেন্ডেন্সি (another_service) যোগ করা হয়েছে।
- কম্পাইলার পাস রেজিস্টার করা:
services.yaml ফাইলে কম্পাইলার পাস রেজিস্টার করতে হবে:
services:
App\DependencyInjection\Compiler\MyCustomCompilerPass:
tags:
- { name: 'kernel.event_listener' }
সার্ভিস ট্যাগস এবং কম্পাইলার পাসের সুবিধা
- ডিপেন্ডেন্সি ইনজেকশন কাস্টমাইজেশন:
সার্ভিস ট্যাগস এবং কম্পাইলার পাস ব্যবহার করে, আপনি Dependency Injection কনটেইনারের আচরণ কাস্টমাইজ করতে পারেন এবং আরও মডুলার অ্যাপ্লিকেশন তৈরি করতে পারেন। - ডাইনামিক সার্ভিস কনফিগারেশন:
এগুলো আপনাকে কোড চলার সময় সার্ভিসের কনফিগারেশন পরিবর্তন করতে সাহায্য করে, যা বিশেষ পরিস্থিতিতে সহায়ক। - রিওজেবেল কম্পোনেন্টস:
সার্ভিস ট্যাগস এবং কম্পাইলার পাস ব্যবহার করে আপনি পুনঃব্যবহারযোগ্য এবং কাস্টম সার্ভিস কম্পোনেন্ট তৈরি করতে পারেন। - কাস্টম লজিক যোগ করা:
সার্ভিস ট্যাগস এবং কম্পাইলার পাসের মাধ্যমে আপনি কাস্টম প্রক্রিয়া বা লজিক প্রয়োগ করতে পারেন যেমন বিভিন্ন সার্ভিসকে একটি নির্দিষ্ট গ্রুপে রাখার জন্য।
সারাংশ
Symfony-তে সার্ভিস ট্যাগস এবং কম্পাইলার পাসেস অত্যন্ত শক্তিশালী ফিচার, যা আপনার অ্যাপ্লিকেশনকে আরও মডুলার এবং কাস্টমাইজযোগ্য করে তোলে। সার্ভিস ট্যাগস ব্যবহার করে আপনি বিশেষ সার্ভিসগুলোতে কাস্টম লজিক অ্যাড করতে পারেন এবং কম্পাইলার পাস ব্যবহার করে সার্ভিস কনফিগারেশন পরিবর্তন করতে পারেন। এগুলি Symfony এর Dependency Injection কনটেইনারের শক্তিকে আরও প্রসারিত করে।
Read more