Laravel

Laravel Service Container ও Dependency Injection কি এবং এটি কীভাবে কাজ করে ?

Md Ruhin Mia
03 Dec, 2025
2 min read
162 views
Laravel Service Container ও Dependency Injection কি এবং এটি কীভাবে কাজ করে ?
 
 
লারাভেল শেখার সময় বেশিরভাগ ডেভেলপারই যে টপিকটি নিয়ে সবচেয়ে বেশি বিভ্রান্ত হন এবং শুরুতে বুঝতে সমস্যায় পড়েন, সেটি হলো “Service Container” এবং “Dependency Injection”।
 
অনেক ডেভেলপার লারাভেল দিয়ে পুরো প্রজেক্ট তৈরি করে ফেললেও, সার্ভিস কন্টেইনার ভিতরে কীভাবে কাজ করে , এর ভূমিকা কী এবং  সেটা স্পষ্টভাবে বুঝতে পারেন না। অথচ Service Container হলো  লারাভেলের মূল ভিত্তি বা হার্ট।
 
আজকে আমি বিষয়টি খুব সহজ ভাষায়,  বাস্তব উদাহরণসহ ব্যাখ্যা করব।
 
 
Laravel Service Container কী?
 
সহজভাবে বললে, Service Container হলো লারাভেলের একটি স্মার্ট সিস্টেম যা অ্যাপ্লিকেশনের বিভিন্ন ক্লাস ও অবজেক্টকে ম্যানেজ, কনফিগার এবং প্রয়োজন অনুযায়ী তৈরি করে দেয়।
 
এর দুটি প্রধান দায়িত্ব হলো:
1. Binding: ক্লাস বা ডিপেন্ডেন্সিগুলোকে রেজিস্টার করা।
2. Resolving: যখন প্রয়োজন, তখন সেই ক্লাসগুলো বা অবজেক্টগুলো অটোমেটিক্যালি আপনাকে তৈরি করে দেওয়া। 
 
অনেকের কাছে বিষয়টি টেকনিক্যাল মনে হতে পারে, তাই একটি বাস্তব উদাহরণ দেখা যাক।
 
একটি সহজ উদাহরণ (Real World Analogy)
 
ধরুন, আপনি একটি Computer ব্যবহার করতে চান। কম্পিউটার চালাতে হলে প্রয়োজনঃ 
• CPU
• RAM
• Hard Disk
• Monitor
 
❌ Service Container ছাড়া (Hard Dependency)
 
আপনি যদি ম্যানুয়ালি সব করতে চান, তবে প্রতিবার কম্পিউটার অন করার আগে আপনাকে বাজারে যেতে  হবে অ্যান্ড then CPU, RAM, Hard Disk কিনে এনে মাদারবোর্ডে লাগিয়ে তারপর কম্পিউটার অন করতে হবে। এটি অত্যন্ত কষ্টের এবং সময়সাপেক্ষ। কোডিংয়ের ভাষায় একে বলা হয় Tight Coupling । 
 
সমাধান:
 ধরুন আপনি একজন দক্ষ হার্ডওয়্যার ইঞ্জিনিয়ারের কাছে গেলেন।
আপনি শুধু বললেন:
“আমার একটি কম্পিউটার দরকার।”
 
তারপর বাকিটা ইঞ্জিনিয়ার নিজেই করে নেবে |
CPU লাগাবে, RAM বসাবে, Hard Disk সেট করবে, সবকিছু প্রস্তুত করে আপনাকে রেডি কম্পিউটার হাতে ধরিয়ে দেবে।
আপনাকে ভেতরের কম্পোনেন্ট নিয়ে একদমই চিন্তা করতে হবে না।
 
Laravel-এর Service Container ঠিক এই হার্ডওয়্যার ইঞ্জিনিয়ারের মতো কাজ করে।
 
আপনি শুধু তাকে বলেন , 
“আমার এই ক্লাস বা এই ডিপেন্ডেন্সি দরকার।”
 
বাকিটা Service Container নিজেই সমাধান করে ফেলে |
কোন ক্লাস দরকার, সে ক্লাসের আরেকটি ক্লাস লাগবে কি না, কনস্ট্রাক্টরে কী ইনজেক্ট হবে, 
সবকিছু অটোমেটিক্যালি Resolve করে আপনাকে Ready অবজেক্ট দিয়ে দেয়।
 
Example: 
 
১. ভুল পদ্ধতি (Without Dependency Injection)
 
class StripePayment {
    public function process() {
        return "Processing payment via Stripe";
    }
}
 
class PaymentService {
    public function pay() {
        $gateway = new StripePayment(); 
        return $gateway->process();
    }
}
 
সমস্যা:
একদিন যদি Stripe বদলে PayPal ব্যবহার করতে হয়, আপনাকে PaymentService ক্লাস সরাসরি পরিবর্তন করতে হবে।
এই coupling in large-scale অ্যাপ্লিকেশনের জন্য অনেক ক্ষতিকর।
 
২. সঠিক পদ্ধতি (With Dependency Injection)
 
interface PaymentGateway {
    public function process();
}
 
class StripePayment implements PaymentGateway {
    public function process() { 
        return "Processing via Stripe"; 
    }
}
 
class PaymentService {
    public function __construct(PaymentGateway $gateway) {
        $this->gateway = $gateway;
    }
}
 

এখন আমরা Container-এ bind করবো:

$this->app->bind(PaymentGateway::class, StripePayment::class);
 
এখানে Service Container স্বয়ংক্রিয়ভাবে বুঝে নেয় যে PaymentService এর জন্য StripePayment প্রয়োজন।
Container নিজেই StripePayment তৈরি করে কনস্ট্রাক্টরে Inject করে দেয়।
 
আপনাকে আর new StripePayment() লিখতে হবে না।
 

এখানে যে প্রক্রিয়ায় Container একটি ক্লাসের প্রয়োজনীয় dependency inject করলো  - এটাই হলো Dependency Injection (DI)

“Dependency Injection মানে হলো, কোনো ক্লাস তার প্রয়োজনীয় জিনিসগুলো নিজের হাতে তৈরি না করে, অন্য কেউ বা অন্য জায়গা থেকে সেটা পেয়ে ব্যবহার করে।”
 
Bind এবং Singleton: গুরুত্বপূর্ণ দুটি কনসেপ্ট
 
Laravel Service Container-এ দুইভাবে ক্লাস রেজিস্টার করা হয়ঃ 
 
১. bind() — প্রতিবার নতুন instance তৈরি করে
 
$this->app->bind('PaymentService', function ($app) {
    return new PaymentService();
});
 
২. singleton() — একবার তৈরি করে বারবার একই instance ব্যবহার
 
ডাটাবেস কানেকশন বা API ক্লায়েন্টের জন্য খুব উপযুক্ত, কারণ প্রতিবার নতুন instance তৈরি করার দরকার নেই, আগেরটিই ব্যবহার করা যায়।
 
কেন Service Container এত গুরুত্বপূর্ণ?
 
• Testing সহজ হয়: Mock দিয়ে সহজে class swap করা যায়।
• Loose Coupling নিশ্চিত হয়: একটি ক্লাস পরিবর্তন হলেও অন্য ক্লাসে প্রভাব পড়ে না।
• অটোমেশন: শত শত ক্লাস manual create করা অসম্ভব; Container স্বয়ংক্রিয়ভাবে ম্যানেজ করে।
• Maintainability বাড়ে: কোড পরিষ্কার, সংগঠিত ও ভবিষ্যৎ-প্রস্তুত থাকে।
 

একটি খুবই গুরুত্বপূর্ণ বিষয়:

 আমরা যদি Laravel-এর কোনো Controller দেখি, সেখানে index() মেথড ছাড়া অন্য সব মেথডে আমরা দেখি $request নামে একটি অবজেক্ট থাকে।

 
public function store(Request $request)
 
একবার ভাবুন!
এই $request আসলে কোথা থেকে আসে?
 
আপনি তো new Request() লিখেননি!
 
এটাই Laravel Service Container-এর কাজ ।
Container স্বয়ংক্রিয়ভাবে Request ক্লাস instantiate করে আপনার মেথডে Inject করে দেয়।
 

এটি Laravel-এর Dependency Injection-এর অন্যতম একটি উদাহরণ।

 
শেষ কথা: 

Service Container-এর concept ভালোভাবে বুঝলে আপনার Laravel কোড আরও maintainable, scalable, testable এবং professional হয়ে উঠবে।

 
 
 

Comments (0)

You need to login to comment

Login

No comments yet. Be the first to comment!