Yii ফ্রেমওয়ার্কে Dependency Injection (DI) এবং Service Locator দুটি গুরুত্বপূর্ণ ডিজাইন প্যাটার্ন ব্যবহার করা হয়। এই প্যাটার্নগুলির মাধ্যমে অ্যাপ্লিকেশনটির ক্লাস এবং কম্পোনেন্টগুলির মধ্যে নির্ভরতা (dependency) ম্যানেজ করা হয়, যা কোডের মডুলারিটি, রিয়ুজেবিলিটি, এবং টেস্টেবিলিটি বৃদ্ধি করে।
Dependency Injection (DI) কী?
Dependency Injection হল একটি ডিজাইন প্যাটার্ন, যেখানে এক ক্লাসের নির্ভরতা (dependency) সরাসরি ক্লাসের মধ্যে ইনজেক্ট করা হয়, পরিবর্তে সেই ক্লাস নিজে নিজের নির্ভরতাগুলি তৈরি করে। এর মাধ্যমে কোডের কাঠামো পরিষ্কার হয় এবং একে অপরের উপর নির্ভরশীলতা কমে যায়।
Yii ফ্রেমওয়ার্কে Dependency Injection Container (DI Container) ব্যবহার করা হয়, যা ক্লাসের ইনস্ট্যান্স তৈরি এবং তাদের মধ্যে নির্ভরতাগুলি পরিচালনা করে। DI ব্যবহার করলে কোড আরও ফ্লেক্সিবল এবং সহজে টেস্ট করা যায়।
Yii-তে Dependency Injection এর ব্যবহার
Yii 2-এ DI ব্যবহারের জন্য আমরা Yii::$container ব্যবহার করতে পারি। এটি DI কন্টেইনারের মতো কাজ করে, যেখানে সমস্ত সার্ভিস বা কম্পোনেন্ট গুলো রেজিস্টার করা থাকে। যখন আপনি কোনও নির্দিষ্ট ক্লাসের ইনস্ট্যান্স চান, তখন Yii স্বয়ংক্রিয়ভাবে তার নির্ভরতাগুলি ইনজেক্ট করে দেয়।
উদাহরণ:
ধরা যাক, আপনার একটি ক্লাস আছে যা কিছু সার্ভিসের উপর নির্ভরশীল:
namespace app\services;
class DatabaseService
{
public function connect()
{
return 'Database connected';
}
}
class UserService
{
private $dbService;
// DatabaseService ইনজেক্ট করা হবে
public function __construct(DatabaseService $dbService)
{
$this->dbService = $dbService;
}
public function getUserData()
{
return $this->dbService->connect() . ' and fetching user data';
}
}
এখানে, UserService ক্লাসটি DatabaseService-এর উপর নির্ভরশীল। এখন আপনি যদি UserService এর ইনস্ট্যান্স তৈরি করতে চান, তবে Yii DI কন্টেইনার আপনাকে সাহায্য করবে:
$userService = Yii::$container->get('app\services\UserService');
echo $userService->getUserData();
এই কোডটি UserService ক্লাসের ইনস্ট্যান্স তৈরি করবে এবং তার মধ্যে DatabaseService ইনজেক্ট করে দিবে।
DI কন্টেইনারে সার্ভিস রেজিস্টার করা
Yii 2-এ আপনি সার্ভিস কন্টেইনারে নির্দিষ্ট সার্ভিস রেজিস্টার করতে পারেন। এটি আপনাকে ক্লাসের ইনস্ট্যান্স তৈরি করার সময় নির্দিষ্ট কনফিগারেশন এবং প্যারামিটারগুলি প্রদান করতে সহায়তা করবে।
Yii::$container->set('app\services\DatabaseService', [
'dsn' => 'mysql:host=localhost;dbname=testdb',
'username' => 'root',
'password' => '',
]);
এখানে, আমরা DatabaseService সার্ভিসটি DI কন্টেইনারে রেজিস্টার করেছি এবং কিছু কনফিগারেশন প্যারামিটার সরবরাহ করেছি।
Service Locator কী?
Service Locator একটি প্যাটার্ন যা নির্ভরশীল ক্লাসগুলিকে একটি কেন্দ্রীয় স্থান (locator) থেকে অ্যাক্সেস করতে দেয়। এতে, ক্লাসগুলো সরাসরি নির্ভরশীলতার উপর নির্ভর করে না, বরং সেই নির্ভরতাগুলি সার্ভিস লোকেটর থেকে পাওয়া যায়।
Yii 2-এ Yii::$app বা Yii::$container কে সেবা প্রদানকারী হিসেবে ব্যবহার করা হয়, যা বিভিন্ন সার্ভিস বা কম্পোনেন্ট এর ইনস্ট্যান্স সংগ্রহ করতে সাহায্য করে। এটি ডেভেলপারকে নির্ভরতাগুলি এক জায়গায় রেজিস্টার করার এবং পরে কোথাওও সেগুলি অ্যাক্সেস করার সুযোগ দেয়।
Yii-তে Service Locator এর ব্যবহার
Service Locator প্যাটার্নটি সাধারণত একটি নির্দিষ্ট সার্ভিস বা কম্পোনেন্ট অ্যাক্সেস করার জন্য ব্যবহার করা হয়। Yii 2-এ, আপনি Yii::$app অথবা Yii::$container এর মাধ্যমে বিভিন্ন অ্যাপ্লিকেশন কম্পোনেন্ট বা সার্ভিসগুলো অ্যাক্সেস করতে পারেন।
উদাহরণ:
ধরা যাক, আপনার একটি সার্ভিস আছে যা সিস্টেম লগিং এর কাজ করে:
namespace app\services;
class LoggerService
{
public function log($message)
{
echo 'Logging message: ' . $message;
}
}
এখন, যদি আপনি এই সার্ভিসটিকে কোথাও ব্যবহার করতে চান, তবে আপনি Yii::$app এর মাধ্যমে এটি অ্যাক্সেস করতে পারেন:
Yii::$app->logger->log('This is a test log message');
এখানে, logger কম্পোনেন্ট Yii::$app থেকে এক্সেস করা হচ্ছে এবং এটি সরাসরি লগ মেসেজটি প্রদর্শন করবে।
DI এবং Service Locator এর মধ্যে পার্থক্য
- Dependency Injection: ক্লাসগুলো তার নির্ভরতাগুলো সরাসরি ইনজেক্টেড পায়, যা কোডটিকে আরও টেস্টেবল এবং মডুলার বানায়। এটি সাধারণত Constructor Injection বা Setter Injection হিসেবে কাজ করে।
- Service Locator: ক্লাসগুলো সরাসরি নির্ভরতাগুলোর জন্য সার্ভিস লোকেটর থেকে চায়, যেটি ক্লাসের বাইরের একটি সার্ভিস প্রদানকারী হিসেবে কাজ করে। এটি কোডের মধ্যে সরাসরি নির্ভরতাগুলোর ট্র্যাকিং কঠিন করে তুলতে পারে, তবে এটা দ্রুত অ্যাক্সেসের জন্য উপযোগী।
সারাংশ
Yii 2 ফ্রেমওয়ার্কে Dependency Injection এবং Service Locator দুটি শক্তিশালী ডিজাইন প্যাটার্ন ব্যবহৃত হয়। Dependency Injection ক্লাসগুলির মধ্যে নির্ভরতাগুলি সরাসরি ইনজেক্ট করে কোডের মডুলারিটি এবং টেস্টেবিলিটি উন্নত করে, যেখানে Service Locator প্যাটার্নের মাধ্যমে একটি সেন্ট্রাল লোকেশন থেকে নির্ভরতাগুলি অ্যাক্সেস করা হয়। Yii 2 এর Yii::$container এবং Yii::$app এর মাধ্যমে আপনি সহজেই Dependency Injection এবং Service Locator ব্যবহার করে আপনার অ্যাপ্লিকেশনকে আরও সহজ, মডুলার এবং রিয়ুজেবল করে তুলতে পারবেন।