Phalcon ফ্রেমওয়ার্কে Dependency Injection (DI) একটি গুরুত্বপূর্ণ ধারণা যা অ্যাপ্লিকেশন কম্পোনেন্টের মধ্যে নির্ভরতা (dependencies) পরিচালনা করতে সাহায্য করে। DI ব্যবহার করে আপনি সহজেই বিভিন্ন সার্ভিস একে অপরের সাথে ইন্টারঅ্যাক্ট করতে পারেন, এবং ফ্রেমওয়ার্কের মধ্যে কাস্টম সার্ভিস যোগ করা সহজ হয়ে ওঠে।
Phalcon এর DI কনটেইনার (DI container) সমস্ত সার্ভিসের জন্য একটি কেন্দ্রীয় স্থান হিসেবে কাজ করে। এই কনটেইনারে সমস্ত সার্ভিস রেজিস্টার করার মাধ্যমে, আপনি অ্যাপ্লিকেশনের যেকোনো অংশে নির্ভরশীলতা ইনজেক্ট করতে পারেন।
এখানে আমরা Custom Services কিভাবে যুক্ত করা হয় এবং Dependency Injection এর মাধ্যমে তা কিভাবে ব্যবহৃত হয়, তা দেখব।
Dependency Injection (DI) এর সাথে Custom Services যোগ করা
Phalcon এ একটি custom service তৈরি করা খুবই সহজ। DI কনটেইনার ব্যবহার করে আপনি কাস্টম সার্ভিস রেজিস্টার করতে পারেন, যা অ্যাপ্লিকেশনের অন্যান্য অংশে সহজেই ইনজেক্ট করা যাবে।
১. Custom Service তৈরি করা
ধরা যাক, আপনি একটি কাস্টম সার্ভিস তৈরি করতে চান যা ইউজারের লগ ইন স্ট্যাটাস চেক করবে। এখানে একটি কাস্টম সার্ভিসের উদাহরণ দেওয়া হলো:
<?php
namespace MyApp\Services;
class AuthService
{
public function isLoggedIn()
{
// যেকোনো প্রমাণীকরণ লজিক এখানে হবে
return isset($_SESSION['user']);
}
public function getUser()
{
return $_SESSION['user'] ?? null;
}
}
এটি একটি খুব সাধারণ কাস্টম সার্ভিস, যা ইউজারের লগ ইন স্ট্যাটাস চেক করে এবং লগ ইন করা ইউজারের তথ্য ফেরত দেয়।
২. Custom Service DI কনটেইনারে রেজিস্টার করা
এখন, এই কাস্টম সার্ভিসটি DI কনটেইনারে রেজিস্টার করতে হবে, যাতে এটি অ্যাপ্লিকেশনের অন্যান্য অংশে সহজে ব্যবহৃত হতে পারে।
<?php
use Phalcon\Di\FactoryDefault;
use MyApp\Services\AuthService;
$di = new FactoryDefault();
// AuthService কাস্টম সার্ভিস রেজিস্টার করা
$di->setShared('auth', function() {
return new AuthService();
});
এখানে, setShared() মেথড ব্যবহার করা হয়েছে, যা সার্ভিসের একটি একক ইনস্ট্যান্স তৈরি করবে এবং সেটিকে সার্ভিস কনটেইনারে সংরক্ষণ করবে।
৩. Custom Service ব্যবহার করা
এখন, আপনি এই কাস্টম সার্ভিসটি অ্যাপ্লিকেশনের যেকোনো জায়গায় ব্যবহার করতে পারেন। উদাহরণস্বরূপ, একটি কন্ট্রোলারে এই সার্ভিস ব্যবহার করা যাক:
<?php
use Phalcon\Mvc\Controller;
class IndexController extends Controller
{
public function indexAction()
{
// AuthService ইনজেক্ট করা
$auth = $this->di->get('auth');
if ($auth->isLoggedIn()) {
echo "Welcome, " . $auth->getUser();
} else {
echo "Please log in first.";
}
}
}
এখানে, আমরা $this->di->get('auth') ব্যবহার করে AuthService সার্ভিসটি কন্ট্রোলারে ইনজেক্ট করেছি এবং তার পর isLoggedIn() এবং getUser() মেথড ব্যবহার করেছি ইউজারের লগ ইন স্ট্যাটাস চেক করার জন্য।
Dependency Injection এর মাধ্যমে Service Injection
Phalcon এ, Dependency Injection (DI) খুবই শক্তিশালী। এর মাধ্যমে আপনি সার্ভিস ইনজেক্ট করতে পারেন সরাসরি কন্ট্রোলার, মডেল, বা অন্য কোনো ক্লাসে। DI একটি ভালো আর্কিটেকচারাল প্যাটার্ন, যা ক্লাসগুলির মধ্যে সিস্টেমের নির্ভরশীলতা হালকা এবং একে অপরের থেকে পৃথক রাখে।
১. Controller এ Dependency Injection
এখন, যদি আপনি কন্ট্রোলারের মধ্যে ডিপেনডেন্সি ইনজেকশন ব্যবহার করতে চান, তবে এটি খুবই সহজ। আমরা যদি একটি LoggerService তৈরি করি, যেটি কন্ট্রোলারে লগ লিখবে, তাহলে তা ইনজেক্ট করা যাবে। উদাহরণস্বরূপ:
<?php
namespace MyApp\Services;
class LoggerService
{
public function log($message)
{
// লগ লেখার লজিক
echo "[LOG]: " . $message;
}
}
এখন, এই LoggerService কন্ট্রোলারে ইনজেক্ট করতে হবে:
<?php
use MyApp\Services\LoggerService;
class IndexController extends Controller
{
protected $logger;
public function initialize()
{
// LoggerService ইনজেক্ট করা
$this->logger = $this->di->get('logger');
}
public function indexAction()
{
// লগ লেখার উদাহরণ
$this->logger->log("Page visited");
echo "Welcome to Phalcon!";
}
}
এখানে, LoggerService কন্ট্রোলারে ইনজেক্ট করা হয়েছে এবং লগ মেসেজ লিখতে ব্যবহার করা হয়েছে।
২. Custom Service এর Life Cycle
Phalcon এ আপনি কাস্টম সার্ভিসের লাইফ সাইকেল কনফিগার করতে পারেন। আপনি set() এবং setShared() মেথড ব্যবহার করতে পারেন সার্ভিসের লাইফ সাইকেল কন্ট্রোল করতে:
set(): সার্ভিসের একাধিক ইনস্ট্যান্স তৈরি করা যাবে।setShared(): সার্ভিসের একটি একক ইনস্ট্যান্স তৈরি করা হবে এবং সেটা সার্ভিস কনটেইনারে সংরক্ষিত থাকবে।
উদাহরণ: setShared() এবং set()
// একক ইনস্ট্যান্স
$di->setShared('logger', function() {
return new LoggerService();
});
// একাধিক ইনস্ট্যান্স
$di->set('userService', function() {
return new UserService();
});
এখানে, logger সার্ভিসটি setShared() দিয়ে রেজিস্টার করা হয়েছে, অর্থাৎ এটি একক ইনস্ট্যান্স হবে এবং অ্যাপ্লিকেশনের যেকোনো জায়গায় ব্যবহার করা যাবে। অন্যদিকে, userService সার্ভিসটি set() দিয়ে রেজিস্টার করা হয়েছে, যার মানে হল যে এটি প্রতি রিকুয়েস্টে একটি নতুন ইনস্ট্যান্স তৈরি করবে।
সারাংশ
Phalcon এ Dependency Injection (DI) এর মাধ্যমে কাস্টম সার্ভিস যুক্ত করা খুবই সহজ এবং শক্তিশালী। আপনি DI কনটেইনারে সার্ভিস রেজিস্টার করতে পারেন এবং কন্ট্রোলার বা অন্য কোনো ক্লাসে সেই সার্ভিস ইনজেক্ট করতে পারেন। Phalcon এর DI সিস্টেম কোডকে আরো পরিষ্কার, মডুলার এবং পুনঃব্যবহারযোগ্য করে তোলে, যা অ্যাপ্লিকেশনের রক্ষণাবেক্ষণ সহজ করে দেয়। DI ব্যবহার করে কাস্টম সার্ভিস এবং ক্লাসগুলির মধ্যে নির্ভরশীলতা ভালোভাবে পরিচালনা করা সম্ভব।
Read more