সার্ভিস কন্টেইনার এবং Dependency Injection

সার্ভিসেস এবং Dependency Injection - সিম্ফনি (Symfony) - Web Development

223

Symfony একটি Dependency Injection (DI) কনটেইনার ব্যবহার করে, যা অ্যাপ্লিকেশন ডেভেলপমেন্টে কোডের পুনঃব্যবহারযোগ্যতা, রক্ষণাবেক্ষণযোগ্যতা এবং টেস্টেবিলিটি বৃদ্ধি করতে সাহায্য করে। Dependency Injection হলো একটি ডিজাইন প্যাটার্ন যা একে অপরের সাথে সম্পর্কিত বিভিন্ন ক্লাসের মধ্যে ডিপেন্ডেন্সি সরবরাহ করে। Symfony-তে, সার্ভিস কন্টেইনার (Service Container) এই Dependency Injection সিস্টেমের জন্য একটি অত্যন্ত গুরুত্বপূর্ণ উপাদান।


Dependency Injection (DI) কী?

Dependency Injection হলো একটি প্যাটার্ন যা ক্লাসের উপর নির্ভরশীল (dependency) অবজেক্টগুলো সরাসরি ইনস্ট্যান্সিয়েট না করে, বাহ্যিকভাবে ইনজেক্ট করে। এর মাধ্যমে অ্যাপ্লিকেশনের কোড ক্লিন এবং মডুলার থাকে, কারণ ডিপেন্ডেন্সিগুলো কন্টেইনারের মাধ্যমে পরিচালিত হয়, যা কোডের নির্দিষ্ট অংশে প্রয়োজনীয় ইনফরমেশন সরবরাহ করে।

DI এর সুবিধা:

  1. কোডের পুনঃব্যবহারযোগ্যতা: একাধিক ক্লাসে একই সার্ভিস বা অবজেক্ট ব্যবহার করা যায়।
  2. রক্ষণাবেক্ষণযোগ্যতা: কোডে পরিবর্তন করতে হলে শুধু কনফিগারেশন ফাইলে পরিবর্তন করা হয়, ক্লাসে নয়।
  3. টেস্টেবিলিটি: সহজে ইউনিট টেস্টিং করা যায়, কারণ ডিপেন্ডেন্সিগুলো কন্টেইনারের মাধ্যমে ইনজেক্ট করা হয়।

সার্ভিস কন্টেইনার (Service Container)

সার্ভিস কন্টেইনার হলো Symfony-র একটি কেন্দ্রীয় কনটেইনার যা সমস্ত সার্ভিস, রিসোর্স এবং কনফিগারেশন সংরক্ষণ করে। সার্ভিস কন্টেইনার Dependency Injection সিস্টেমের কেন্দ্রবিন্দু, যা সার্ভিসগুলোর ইনস্ট্যান্স তৈরি এবং পরিচালনা করে। এটি Symfony অ্যাপ্লিকেশনকে খুবই শক্তিশালী এবং স্কেলেবল করে তোলে, কারণ একে অন্যের সাথে সম্পর্কিত ডিপেন্ডেন্সিগুলিকে স্বয়ংক্রিয়ভাবে ইনজেক্ট করা হয়।

সার্ভিস কন্টেইনারের কাজ:

  1. সার্ভিসের ইনস্ট্যান্স তৈরি করা।
  2. ডিপেন্ডেন্সি সরবরাহ করা (যেমন, কন্ট্রোলারের জন্য সার্ভিস ইনজেক্ট করা)।
  3. অ্যাপ্লিকেশন চলাকালীন সার্ভিসগুলোর একক ইনস্ট্যান্স বজায় রাখা (singletone pattern)।

সার্ভিস কনফিগারেশন এবং ডিফিনিশন

Symfony সার্ভিস কন্টেইনারের মাধ্যমে সার্ভিসগুলো কনফিগার এবং ডিফাইন করা হয়। সার্ভিস কনফিগারেশন YAML, XML, অথবা PHP ফাইল ব্যবহার করে করা যেতে পারে। বর্তমানে, YAML কনফিগারেশন সবচেয়ে জনপ্রিয়।

YAML কনফিগারেশন (services.yaml)

# config/services.yaml
services:
    # পরিষেবা সংজ্ঞায়িত করা
    App\Service\MyService:
        arguments:
            $parameter: '%env(MY_SERVICE_PARAMETER)%'  # পরিবেশ ভেরিয়েবল ইনজেক্ট করা

কাস্টম সার্ভিস তৈরি এবং ব্যবহার

  1. কাস্টম সার্ভিস ক্লাস (MyService.php):

    namespace App\Service;
    
    class MyService
    {
        private $parameter;
    
        public function __construct(string $parameter)
        {
            $this->parameter = $parameter;
        }
    
        public function greet(): string
        {
            return "Hello, " . $this->parameter;
        }
    }
    
  2. কনফিগারেশন ফাইল (services.yaml):

    services:
        App\Service\MyService:
            arguments:
                $parameter: 'World'  # সার্ভিসের জন্য ডিপেন্ডেন্সি ইনজেক্ট করা হচ্ছে
    
  3. কন্ট্রোলারে সার্ভিস ব্যবহার:

    namespace App\Controller;
    
    use App\Service\MyService;
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\HttpFoundation\Response;
    
    class MyController extends AbstractController
    {
        public function index(MyService $myService): Response
        {
            return new Response($myService->greet());
        }
    }
    

এখানে, MyService ক্লাসটি সার্ভিস কন্টেইনারের মাধ্যমে কন্ট্রোলারে ইনজেক্ট করা হয়েছে এবং ব্যবহার করা হয়েছে।


Autowiring

Autowiring একটি ফিচার যা Symfony সার্ভিস কন্টেইনারকে স্বয়ংক্রিয়ভাবে সার্ভিসের ডিপেন্ডেন্সি খুঁজে বের করতে সাহায্য করে। আপনি যদি autowire: true ব্যবহার করেন, Symfony সার্ভিসে ডিপেন্ডেন্সি ইনজেক্ট করতে গেটার বা কনস্ট্রাক্টর ব্যবহার করে। এই ফিচারটি কোড লেখার সময় অনেক সহজ করে দেয়।

Autowiring উদাহরণ:

services:
    App\Service\MyService:
        autowire: true

এখানে, MyService-এর জন্য সমস্ত ডিপেন্ডেন্সি স্বয়ংক্রিয়ভাবে কন্টেইনারের মাধ্যমে ইনজেক্ট করা হবে।


Autoconfiguration

Autoconfiguration একটি ফিচার যা Symfony সার্ভিস কনফিগারেশনকে আরও সহজ করে তোলে। এটি স্বয়ংক্রিয়ভাবে সার্ভিসের জন্য ডিফল্ট কনফিগারেশন বা সেটিংস প্রয়োগ করে। যদি আপনি কোনো সার্ভিস ক্লাসে বিশেষ কোনো ইন্টারফেস বা অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করেন, তবে Symfony সেটি স্বয়ংক্রিয়ভাবে কনফিগার করবে।

Autoconfiguration উদাহরণ:

services:
    App\Service\*:
        autoconfigure: true

এখানে, App\Service\* প্যাকেজের সমস্ত সার্ভিসগুলিকে স্বয়ংক্রিয়ভাবে কনফিগার এবং প্রক্রিয়া করা হবে।


সার্ভিস ইনজেকশন এবং কনস্ট্রাক্টর ইনজেকশন

Dependency Injection সাধারণত দুইভাবে করা হয়:

  1. Constructor Injection
    যখন সার্ভিসের ডিপেন্ডেন্সি কনস্ট্রাক্টর মাধ্যমে ইনজেক্ট করা হয়।

    class MyService
    {
        private $logger;
    
        public function __construct(LoggerInterface $logger)
        {
            $this->logger = $logger;
        }
    }
    
  2. Setter Injection
    যখন ডিপেন্ডেন্সি সেটার মেথডের মাধ্যমে ইনজেক্ট করা হয়।

    class MyService
    {
        private $logger;
    
        public function setLogger(LoggerInterface $logger): void
        {
            $this->logger = $logger;
        }
    }
    

সারাংশ

Symfony সার্ভিস কন্টেইনার এবং Dependency Injection (DI) একটি অত্যন্ত গুরুত্বপূর্ণ ডিজাইন প্যাটার্ন, যা অ্যাপ্লিকেশনের কোডকে মডুলার, পুনঃব্যবহারযোগ্য এবং রক্ষণাবেক্ষণযোগ্য করে তোলে। সার্ভিস কন্টেইনারের মাধ্যমে আপনার অ্যাপ্লিকেশনে বিভিন্ন ডিপেন্ডেন্সি পরিচালনা করা হয় এবং সার্ভিস ইনজেকশন দ্বারা কোডের সঠিক কাজ নিশ্চিত করা হয়। Autowiring এবং Autoconfiguration ব্যবহার করে এই প্রক্রিয়া আরও সহজ ও শক্তিশালী করা যায়।

Content added By
Promotion

Are you sure to start over?

Loading...