Dependency Injection (DI) একটি গুরুত্বপূর্ণ ডিজাইন প্যাটার্ন, যা ক্লাসের প্রয়োজনীয় ডিপেন্ডেন্সি (অর্থাৎ, অন্যান্য সার্ভিস বা ক্লাস) সরাসরি ইনস্টল করার পরিবর্তে বাহ্যিকভাবে ইনজেক্ট করার মাধ্যমে ক্লাসগুলোর মধ্যে নির্ভরশীলতা কমিয়ে দেয়। Symfony-তে Controllers এ Dependency Injection ব্যবহারের মাধ্যমে, আপনি সহজে এবং পরিষ্কারভাবে আপনার অ্যাপ্লিকেশনকে মডুলার ও স্কেলেবল করতে পারেন।
Controllers এ Dependency Injection কীভাবে কাজ করে?
Symfony-তে Controllers সাধারণত HTTP অনুরোধ গ্রহণ করে এবং সেই অনুযায়ী অ্যাকশন সম্পাদন করে। যখন কোনো Controller এর কার্যকারিতার জন্য অন্য কোনো সার্ভিসের প্রয়োজন হয়, তখন Dependency Injection এর মাধ্যমে ওই সার্ভিসটি Controller-এ ইনজেক্ট করা হয়।
Controller-এ Dependency Injection এর প্রধান সুবিধা:
- মডুলারিটি ও পুনঃব্যবহারযোগ্যতা: DI ব্যবহারে Controller নির্দিষ্ট সার্ভিসের উপর কম নির্ভরশীল হয়ে ওঠে, এবং সার্ভিসগুলো পুনঃব্যবহারযোগ্য হয়।
- টেস্টেবিলিটি: DI ব্যবহারে কোডটি সহজে টেস্ট করা যায়, কারণ নির্ভরশীলতা ইনজেক্ট করা হয়, এবং তা mock করা সম্ভব।
- লাউজিক সরলতা: Controller কেবলমাত্র তার কার্যকারিতা পরিচালনা করে, সার্ভিসগুলো স্বতন্ত্রভাবে নির্দিষ্ট কাজ করে।
Symfony-তে Controllers এ Dependency Injection এর প্রক্রিয়া
Symfony-তে Controller-এ Dependency Injection দুটি প্রধান উপায়ে করা যায়:
- Constructor Dependency Injection
- Setter Dependency Injection
১. Constructor Dependency Injection
Symfony-তে সর্বাধিক ব্যবহৃত পদ্ধতি হল Constructor Dependency Injection। এই পদ্ধতিতে, যখন Controller তৈরি হয়, তখন নির্দিষ্ট সার্ভিস (অথবা ডিপেন্ডেন্সি) কন্সট্রাক্টরের মাধ্যমে Controller-এ ইনজেক্ট করা হয়।
উদাহরণ:
ধরা যাক, আমাদের একটি ProductService নামের সার্ভিস আছে, যা পণ্য সম্পর্কিত লজিক পরিচালনা করে এবং আমাদের একটি ProductController রয়েছে যা সেই সার্ভিসের সাহায্যে পণ্য সম্পর্কিত তথ্য প্রদর্শন করবে।
ProductService (সার্ভিস):
namespace App\Service; class ProductService { public function getProducts(): array { return ['Product 1', 'Product 2', 'Product 3']; } }ProductController (কন্ট্রোলার):
Controller-এ
ProductServiceইনজেক্ট করতে Constructor Dependency Injection ব্যবহার করা হবে।namespace App\Controller; use App\Service\ProductService; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; class ProductController extends AbstractController { private $productService; // Constructor Dependency Injection public function __construct(ProductService $productService) { $this->productService = $productService; } public function show(): Response { $products = $this->productService->getProducts(); return $this->render('product/show.html.twig', [ 'products' => $products ]); } }- ব্যাখ্যা:
ProductServiceকন্সট্রাক্টরের মাধ্যমেProductController-এ ইনজেক্ট করা হয়েছে।ProductServiceকন্ট্রোলারের ভেরিয়েবলে সেট করা হয়েছে এবং তারপরেshow()অ্যাকশন থেকে এটি ব্যবহার করা হয়েছে।
- ব্যাখ্যা:
Service Configuration (services.yaml):
Symfony, automatic wiring ফিচার ব্যবহার করে সার্ভিস গুলি স্বয়ংক্রিয়ভাবে ইনজেক্ট করে। তবে, যদি কোনো কাস্টম সার্ভিস কনফিগার করতে চান, তাহলে services.yaml ফাইলের মাধ্যমে সেটি করতে হবে।# config/services.yaml services: App\Service\ProductService: ~ App\Controller\ProductController: arguments: $productService: '@App\Service\ProductService'- এই কনফিগারেশন দ্বারা
ProductController-এProductServiceসঠিকভাবে ইনজেক্ট করা হবে।
- এই কনফিগারেশন দ্বারা
২. Setter Dependency Injection
এটি Controller-এ setter মেথড ব্যবহার করে ডিপেন্ডেন্সি ইনজেক্ট করার পদ্ধতি। সাধারণত এটি কম ব্যবহৃত হয়, তবে কিছু ক্ষেত্রে সেটার মেথডে ডিপেন্ডেন্সি ইনজেকশন উপযোগী হতে পারে।
উদাহরণ:
ProductController (Setter Dependency Injection):
namespace App\Controller; use App\Service\ProductService; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; class ProductController extends AbstractController { private $productService; // Setter Dependency Injection public function setProductService(ProductService $productService): void { $this->productService = $productService; } public function show(): Response { $products = $this->productService->getProducts(); return $this->render('product/show.html.twig', [ 'products' => $products ]); } }Service Configuration (services.yaml):
এখানে setter মেথডের মাধ্যমেProductServiceইনজেক্ট করতে হবে।# config/services.yaml services: App\Service\ProductService: ~ App\Controller\ProductController: calls: - method: 'setProductService' arguments: ['@App\Service\ProductService']setProductServiceমেথডের মাধ্যমেProductServiceইনজেক্ট করা হবে।
Symfony Controller-এ Dependency Injection এর সুবিধা
- কোড পুনঃব্যবহারযোগ্যতা বৃদ্ধি:
DI ব্যবহারে Controller কম নির্ভরশীল হয় এবং সার্ভিসগুলো পুনরায় ব্যবহারযোগ্য হয়ে ওঠে। - টেস্টিং সহজ:
Dependency Injection-এর মাধ্যমে Controller এবং সার্ভিসগুলি সহজেই mock করা যায়, যা ইউনিট টেস্টিং সহজ করে। - স্কেলেবিলিটি এবং মডুলারিটি:
DI ব্যবহারে নতুন ফিচার বা সার্ভিস যুক্ত করা সহজ হয়, যা প্রজেক্ট স্কেলেবিলিটি এবং মডুলারিটি বৃদ্ধি করে।
সারাংশ
Symfony-তে Controllers এ Dependency Injection ব্যবহারের মাধ্যমে কোড আরও পরিষ্কার, স্কেলেবল এবং পুনঃব্যবহারযোগ্য হয়। Constructor Dependency Injection সাধারণত বেশি ব্যবহৃত হয়, তবে Setter Dependency Injection কিছু বিশেষ পরিস্থিতিতে ব্যবহার করা যেতে পারে। DI-এর মাধ্যমে Controller এর লজিক আলাদা করে রাখা যায় এবং অ্যাপ্লিকেশনের টেস্টিং সহজ হয়ে ওঠে।
Read more