Phalcon ফ্রেমওয়ার্কে Dependency Injection (DI) এবং Service Container দুটি অত্যন্ত গুরুত্বপূর্ণ কনসেপ্ট যা কোডের modularity, reusability, এবং testability উন্নত করতে সাহায্য করে। DI এবং Service Container ব্যবহারের মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনের বিভিন্ন কম্পোনেন্টকে একে অপরের থেকে আলাদা করে রাখতে পারেন এবং সহজে তাদের মধ্যে যোগাযোগ স্থাপন করতে পারেন।
Dependency Injection (DI) কী?
Dependency Injection হল একটি ডিজাইন প্যাটার্ন যা আপনাকে একটি ক্লাসের ইনস্ট্যান্স (অথবা ডিপেন্ডেন্সি) বাইরে থেকে সরবরাহ করতে দেয়, এর মাধ্যমে ক্লাসটি নিজে থেকে তার ডিপেন্ডেন্সি তৈরি করতে বাধ্য হয় না। এর মাধ্যমে কোডের পুনঃব্যবহারযোগ্যতা, স্কেলেবিলিটি এবং পরীক্ষামূলকতা (testability) বৃদ্ধি পায়।
ফ্যালকন ফ্রেমওয়ার্কে, DI ব্যবস্থাপনা একটি Service Container এর মাধ্যমে হয়।
Service Container কী?
Service Container হল একটি পাত্র (container) যা আপনার অ্যাপ্লিকেশনটির বিভিন্ন services (যেমন, ডাটাবেস কানেকশন, লগার, HTTP ক্লায়েন্ট) এবং dependencies সংরক্ষণ করে। এটি একটি কেন্দ্রীয় জায়গা যেখানে আপনি আপনার অ্যাপ্লিকেশন কম্পোনেন্টগুলো নিবন্ধন এবং পরিচালনা করতে পারেন। Phalcon DI Container ক্লাস (Phalcon\Di) ব্যবহার করে এই কাজটি সম্পন্ন করা হয়।
Phalcon এ Dependency Injection এবং Service Container ব্যবহার
Phalcon এ DI এবং Service Container ব্যবহারের মাধ্যমে আমরা বিভিন্ন ক্লাসের ডিপেন্ডেন্সি ম্যানেজ এবং ইনজেক্ট করতে পারি। আসুন, একটি উদাহরণ দেখে বুঝে নিই কিভাবে এটি কাজ করে।
Step 1: DI Container কনফিগার করা
প্রথমে, আমরা Phalcon\Di ক্লাসের একটি ইনস্ট্যান্স তৈরি করব এবং এতে আমাদের সার্ভিসগুলো নিবন্ধন করব।
use Phalcon\Di\FactoryDefault;
use Phalcon\Db\Adapter\Pdo\Mysql as DbAdapter;
use Phalcon\Logger;
use Phalcon\Logger\Adapter\Stream as StreamAdapter;
// DI Container তৈরি করা
$di = new FactoryDefault();
// ডাটাবেস সার্ভিস নিবন্ধন করা
$di->set('db', function () {
return new DbAdapter([
'host' => 'localhost',
'username' => 'root',
'password' => '',
'dbname' => 'test_db',
]);
});
// লগার সার্ভিস নিবন্ধন করা
$di->set('logger', function () {
return new Logger('messages', [
'main' => new StreamAdapter('php://stdout'),
]);
});
এখানে, আমরা দুটি সার্ভিস নিবন্ধন করেছি: একটি db সার্ভিস যা ডাটাবেস কানেকশনের জন্য ব্যবহার হবে, এবং আরেকটি logger সার্ভিস যা লগ তৈরি করার জন্য ব্যবহার হবে।
Step 2: Service Injection ব্যবহার করা
এখন, আমাদের যেকোনো ক্লাসে db এবং logger সার্ভিস ইনজেক্ট করতে পারব। নিচে একটি উদাহরণ দেওয়া হলো যেখানে আমরা একটি ক্লাসে ডিপেন্ডেন্সি ইনজেক্ট করছি।
use Phalcon\Mvc\Controller;
class IndexController extends Controller
{
public function indexAction()
{
// DI Container থেকে db এবং logger সার্ভিস ইনজেক্ট করা
$db = $this->di->get('db');
$logger = $this->di->get('logger');
// ডাটাবেসে একটি সিম্পল কুয়েরি চালানো
$result = $db->query("SELECT * FROM users");
// লগার ব্যবহার করে একটি মেসেজ লোগ করা
$logger->info("Query executed successfully");
// ফলাফল প্রদর্শন
echo "Query result: " . json_encode($result->fetchAll());
}
}
এখানে, IndexController এ আমরা DI Container থেকে db এবং logger সার্ভিস ইনজেক্ট করেছি। এর ফলে, আমাদের ক্লাসটি এই ডিপেন্ডেন্সি নিয়ে কাজ করতে পারবে এবং কোডের পুনঃব্যবহারযোগ্যতা ও মডিউলারিটি বৃদ্ধি পাবে।
Step 3: DI এবং Service Container এর মাধ্যমে আরও কাস্টম সার্ভিস
এখন, আমরা একটি কাস্টম সার্ভিস নিবন্ধন করে এবং তা DI Container থেকে ইনজেক্ট করার উদাহরণ দেখব।
use Phalcon\Di\ServiceProviderInterface;
class CustomService implements ServiceProviderInterface
{
public function register(\Phalcon\DiInterface $di)
{
$di->set('custom', function () {
return new CustomClass();
});
}
}
এখানে, CustomService একটি কাস্টম সার্ভিস যা CustomClass কে DI Container এ নিবন্ধন করছে।
Step 4: DI Container থেকে কাস্টম সার্ভিস ব্যবহার
use Phalcon\Mvc\Controller;
class IndexController extends Controller
{
public function indexAction()
{
// DI Container থেকে কাস্টম সার্ভিস ইনজেক্ট করা
$customService = $this->di->get('custom');
// কাস্টম সার্ভিসের মাধ্যমে কিছু কার্যকলাপ করা
$customService->doSomething();
}
}
এখানে, আমরা DI Container থেকে custom সার্ভিস ইনজেক্ট করেছি এবং তার পরে সেই সার্ভিস ব্যবহার করেছি।
সারাংশ
Phalcon ফ্রেমওয়ার্কে Dependency Injection (DI) এবং Service Container একটি শক্তিশালী কনসেপ্ট যা ডিপেন্ডেন্সি ম্যানেজমেন্টকে আরও সহজ এবং মডুলার করে তোলে। এটি কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি করে এবং অ্যাপ্লিকেশনটির স্কেলেবিলিটি ও টেস্টেবিলিটি উন্নত করতে সহায়ক। Phalcon এ DI এবং Service Container ব্যবহার করে বিভিন্ন সার্ভিস এবং ডিপেন্ডেন্সি অ্যাপ্লিকেশন সহজেই পরিচালনা করা যায় এবং বিভিন্ন ক্লাসে ইনজেক্ট করা যায়।
Dependency Injection (DI) হল একটি ডিজাইন প্যাটার্ন যা ফ্যালকন (Phalcon) ফ্রেমওয়ার্কে ব্যবহার করা হয় অ্যাপ্লিকেশনটির বিভিন্ন কম্পোনেন্ট বা ক্লাসগুলির মধ্যে ডিপেনডেন্সি (অথবা নির্ভরশীলতা) ইনজেক্ট করতে। ফ্যালকন এ DI কনটেইনার ব্যবহারের মাধ্যমে, আপনি একটি ক্লাসের বা সার্ভিসের নির্ভরশীলতা অন্য কোথাও থেকে প্রদান করতে পারেন, পরিবর্তে তা নিজে তৈরি করার।
DI কনটেইনার হল একটি সেন্ট্রালized সার্ভিস কনটেইনার, যেখানে আপনার অ্যাপ্লিকেশনের বিভিন্ন সার্ভিস বা অবজেক্টগুলি রেজিস্টার করা থাকে। যখন আপনি কোনও সার্ভিসের প্রয়োজন অনুভব করেন, তখন DI কনটেইনার সেটি তৈরি করে এবং ইনজেক্ট করে।
এই প্যাটার্নের সাহায্যে ডিপেনডেন্সি ম্যানেজমেন্ট এবং টেস্টিং সহজ হয়, কারণ আপনি কন্ট্রোলারের মধ্যে নির্ভরশীল ক্লাস বা সার্ভিস সরাসরি ইনস্ট্যানশিয়েট করতে না গিয়ে, কেবল DI কনটেইনারের মাধ্যমে ইনজেক্ট করতে পারেন।
DI কনটেইনারের মূল বৈশিষ্ট্য
- ডিপেনডেন্সি ইনজেকশন: DI কনটেইনার সব সিস্টেমের ডিপেনডেন্সি ম্যানেজ করে। আপনার ক্লাস বা সার্ভিসের জন্য সব ডিপেনডেন্সি কনটেইনারের মাধ্যমে ইনজেক্ট করা হয়, যার ফলে ক্লাসগুলির মধ্যে কোডের পুনরাবৃত্তি কমে যায়।
- ক্লাস এবং সার্ভিস রেজিস্ট্রেশন: DI কনটেইনারে আপনি সার্ভিস বা ক্লাস রেজিস্টার করেন, যা পরবর্তীতে অ্যাপ্লিকেশন চলাকালে প্রয়োজন অনুসারে তৈরি ও ইনজেক্ট করা হয়।
- স্কোপ ও লাইফটাইম ম্যানেজমেন্ট: DI কনটেইনার বিভিন্ন লাইফটাইম স্কোপে সার্ভিস তৈরি করতে সক্ষম। আপনি একটি সার্ভিসকে একক ইনস্ট্যান্স বা নতুন ইনস্ট্যান্স তৈরি করার জন্য কনফিগার করতে পারেন।
- এপ্লিকেশন স্কেলেবিলিটি: DI কনটেইনার ব্যবহারের মাধ্যমে অ্যাপ্লিকেশনটি আরও স্কেলেবল এবং মডুলার হয়, কারণ কম্পোনেন্টগুলির মধ্যে সরাসরি ডিপেনডেন্সি থাকে না এবং ডিপেনডেন্সি কনটেইনার তা পরিচালনা করে।
Phalcon এ DI কনটেইনার কিভাবে কাজ করে?
Phalcon এ DI কনটেইনার একটি Phalcon\DI\Container অবজেক্ট, যা অ্যাপ্লিকেশনের সার্ভিসগুলির জন্য ব্যবহৃত হয়। কনটেইনারে আপনি সমস্ত সার্ভিস রেজিস্টার করতে পারেন এবং পরে সেগুলিকে ক্লাসের মধ্যে ইনজেক্ট করতে পারেন।
1. DI কনটেইনার সেটআপ
Phalcon এ DI কনটেইনার সেটআপ করতে, প্রথমে Phalcon\Di\FactoryDefault ব্যবহার করা হয় যা ডিফল্ট কনটেইনার প্রদান করে।
use Phalcon\Di\FactoryDefault;
$di = new FactoryDefault();
এখানে, FactoryDefault একটি ডিফল্ট DI কনটেইনার সরবরাহ করে, যা Phalcon এর সাথে পূর্বনির্ধারিত কিছু সার্ভিস যেমন ডেটাবেস, ক্যাশ, ইত্যাদি অন্তর্ভুক্ত করে।
2. সার্ভিস রেজিস্ট্রেশন
কোনো সার্ভিস বা ক্লাস DI কনটেইনারে রেজিস্টার করার জন্য, set() মেথড ব্যবহার করা হয়। উদাহরণস্বরূপ, একটি ডেটাবেস সার্ভিস রেজিস্টার করা:
$di->set('db', function() {
return new Phalcon\Db\Adapter\Pdo\Mysql([
"host" => "localhost",
"username" => "root",
"password" => "",
"dbname" => "test_db"
]);
});
এখানে, db নামের একটি সার্ভিস Phalcon\Db\Adapter\Pdo\Mysql এর মাধ্যমে রেজিস্টার করা হয়েছে।
3. DI কনটেইনার থেকে সার্ভিস অ্যাক্সেস
একবার একটি সার্ভিস কনটেইনারে রেজিস্টার হয়ে গেলে, আপনি এটি অ্যাপ্লিকেশনের যেকোনো জায়গা থেকে অ্যাক্সেস করতে পারেন। উদাহরণস্বরূপ:
$db = $di->get('db');
এখানে, get('db') মেথডের মাধ্যমে db সার্ভিসটি কনটেইনার থেকে নেয়া হচ্ছে এবং $db এর মাধ্যমে আপনি ডেটাবেস অপারেশন করতে পারবেন।
4. ইনজেকশন ব্যবহার
Phalcon এ আপনি DI কনটেইনার ব্যবহার করে আপনার কন্ট্রোলার বা অন্যান্য ক্লাসে নির্ভরশীল সার্ভিসগুলো ইনজেক্ট করতে পারেন। উদাহরণস্বরূপ:
use Phalcon\Mvc\Controller;
class IndexController extends Controller
{
protected $db;
public function onConstruct()
{
// DI কনটেইনার থেকে db সার্ভিস ইনজেক্ট করা
$this->db = $this->di->get('db');
}
public function indexAction()
{
$result = $this->db->query("SELECT * FROM users");
print_r($result->fetchAll());
}
}
এখানে, onConstruct মেথডের মাধ্যমে DI কনটেইনার থেকে db সার্ভিস ইনজেক্ট করা হয়েছে, যাতে আপনি তা পরবর্তী মেথডে ব্যবহার করতে পারেন।
5. DI কনটেইনারের লাইফটাইম ম্যানেজমেন্ট
Phalcon এর DI কনটেইনারে আপনি সার্ভিসের লাইফটাইম কনফিগার করতে পারেন। দুই ধরনের লাইফটাইম থাকে:
- প্রত্যেকবার নতুন ইনস্ট্যান্স: সার্ভিসটি প্রতি রিকোয়েস্টে নতুন করে তৈরি হবে।
- সিঙ্গেলটন (Singleton): সার্ভিসটি শুধুমাত্র একবার তৈরি হবে এবং সেই একই ইনস্ট্যান্স পরবর্তী রিকোয়েস্টগুলিতে ব্যবহৃত হবে।
// সিঙ্গেলটন
$di->setShared('db', function() {
return new Phalcon\Db\Adapter\Pdo\Mysql([
"host" => "localhost",
"username" => "root",
"password" => "",
"dbname" => "test_db"
]);
});
এখানে, setShared ব্যবহার করে db সার্ভিসটি সিঙ্গেলটন হিসেবে রেজিস্টার করা হয়েছে, যার মানে সার্ভিসটি একবার তৈরি হবে এবং পরবর্তী রিকোয়েস্টে একই ইনস্ট্যান্স ব্যবহৃত হবে।
সারাংশ
Phalcon ফ্রেমওয়ার্কে Dependency Injection (DI) কনটেইনার একটি অত্যন্ত শক্তিশালী এবং গুরুত্বপূর্ণ উপাদান, যা অ্যাপ্লিকেশনের বিভিন্ন সার্ভিস এবং ডিপেনডেন্সির মধ্যে সম্পর্ক সহজে পরিচালনা করে। এটি সার্ভিস রেজিস্টার করা, ডিপেনডেন্সি ইনজেকশন, এবং লাইফটাইম ম্যানেজমেন্টের জন্য ব্যবহার করা হয়। DI কনটেইনার ব্যবহারের মাধ্যমে আপনার অ্যাপ্লিকেশন আরও মডুলার, স্কেলেবল, এবং টেস্টেবল হয়। Phalcon এর DI সিস্টেম ডেভেলপারদের কোড অর্গানাইজেশনে সাহায্য করে এবং অ্যাপ্লিকেশনের কার্যকারিতা উন্নত করে।
Phalcon ফ্রেমওয়ার্কে Service Providers একটি গুরুত্বপূর্ণ ধারণা, যা Dependency Injection (DI) কন্টেইনারে নির্দিষ্ট পরিষেবাগুলি (services) নিবন্ধিত করে এবং অ্যাপ্লিকেশনের বিভিন্ন অংশে ব্যবহারের জন্য উপলব্ধ করে। এটি সফটওয়্যারের মডুলারিটি এবং রক্ষণাবেক্ষণযোগ্যতা উন্নত করতে সাহায্য করে। Service Providers সাধারণত থার্ড-পার্টি লাইব্রেরি বা কাস্টম পরিষেবাগুলির জন্য ব্যবহার করা হয়, যা DI কন্টেইনারে সংজ্ঞায়িত করা হয় এবং অ্যাপ্লিকেশন জুড়ে যে কোনও স্থান থেকে ব্যবহার করা যেতে পারে।
Phalcon ফ্রেমওয়ার্কে Service Providers তৈরি এবং কনফিগার করা সহজ এবং পরিষ্কার।
Service Providers কী?
Service Providers হলো ক্লাস বা ফাংশন যা DI কন্টেইনারে নির্দিষ্ট পরিষেবাগুলি নিবন্ধিত করে এবং সেগুলিকে অ্যাপ্লিকেশনের যেকোনো অংশে ব্যবহারের জন্য উপলব্ধ করে। এগুলি সাধারণত অ্যাপ্লিকেশন এর প্রয়োজনীয় সেবা, যেমন ডাটাবেস সংযোগ, ক্যাশিং সিস্টেম, লগিং, বা অন্যান্য কাস্টম ক্লাস সরবরাহ করে।
Phalcon এ DI কন্টেইনারের মাধ্যমে পরিষেবা প্রদান এবং ব্যবস্থাপনা হয়। এটি এমন একটি ডিজাইন প্যাটার্ন যা আপনার কোডকে ভালোভাবে সংগঠিত এবং নমনীয় করে তোলে।
Service Providers তৈরি করা
Phalcon এ Service Providers তৈরি করতে, আপনাকে Dependency Injection (DI) কন্টেইনার ব্যবহার করতে হবে এবং সেখানে পরিষেবাগুলি নিবন্ধিত করতে হবে।
উদাহরণ: কাস্টম Service Provider তৈরি করা
ধরা যাক, আপনি একটি MailService তৈরি করতে চান, যা ইমেইল পাঠানোর কাজ করবে। প্রথমে আপনাকে একটি কাস্টম ক্লাস তৈরি করতে হবে:
namespace MyApp\Services;
class MailService
{
protected $host;
protected $port;
public function __construct($host, $port)
{
$this->host = $host;
$this->port = $port;
}
public function send($to, $subject, $message)
{
// ইমেইল পাঠানোর লজিক
echo "Sending email to $to with subject $subject";
}
}
এখন, MailService ক্লাসটি DI কন্টেইনারে নিবন্ধিত করতে হবে:
use Phalcon\Di\FactoryDefault;
$di = new FactoryDefault();
$di->setShared('mailService', function () {
return new \MyApp\Services\MailService('smtp.example.com', 587);
});
এখানে, setShared() মেথড ব্যবহার করে MailService কন্টেইনারে নিবন্ধিত করা হয়েছে। shared হওয়ার কারণে এটি একবারই ইনস্ট্যান্স হবে এবং অ্যাপ্লিকেশনের যেকোনো স্থানে ব্যবহার করা যাবে।
Service Providers কনফিগার করা
এখন, MailService কনফিগার করা হবে, এবং এটি আপনার অ্যাপ্লিকেশনের যেকোনো স্থানে ব্যবহার করা যাবে।
কনফিগারেশন ব্যবহার করা
Phalcon এর DI কন্টেইনারে কোনো কনফিগারেশন যোগ করার জন্য আপনি একটি কনফিগারেশন ফাইল বা অ্যারে ব্যবহার করতে পারেন। নিচে একটি কনফিগারেশন ফাইল ব্যবহার করার উদাহরণ দেওয়া হলো:
// config.php
return [
'mail' => [
'host' => 'smtp.example.com',
'port' => 587
]
];
এখন, DI কন্টেইনারে এই কনফিগারেশনটি ইনজেক্ট করা হবে:
$config = include('config.php');
$di->setShared('mailService', function () use ($config) {
return new \MyApp\Services\MailService($config['mail']['host'], $config['mail']['port']);
});
এখানে, কনফিগারেশন ফাইল থেকে ইমেইল সার্ভারের হোস্ট এবং পোর্ট প্যারামিটারগুলো লোড করা হয়েছে এবং সেগুলো MailService ক্লাসে পাস করা হয়েছে।
Service ব্যবহার করা
এখন, আপনার অ্যাপ্লিকেশনের যেকোনো অংশে mailService ব্যবহার করতে পারবেন:
$mailService = $di->getShared('mailService');
$mailService->send('user@example.com', 'Test Subject', 'Test Message');
এখানে, আমরা getShared() মেথড ব্যবহার করে DI কন্টেইনার থেকে mailService পরিষেবা পেয়েছি এবং send() মেথড কল করেছি।
Phalcon এ Service Providers এর সুবিধা
- মডুলার কোড: Service Providers এর মাধ্যমে কোড মডুলার হয় এবং বিভিন্ন পরিষেবা একটি কেন্দ্রীয় স্থান থেকে পরিচালনা করা যায়।
- ডিপেনডেন্সি ইনজেকশন: এটি ডিপেনডেন্সি ইনজেকশন (DI) প্যাটার্নে সহায়ক, যা কোডের নির্ভরশীলতা কমিয়ে দেয় এবং টেস্টিং সহজ করে তোলে।
- কাস্টম পরিষেবা: আপনি কাস্টম পরিষেবা তৈরি এবং কনফিগার করতে পারেন যা আপনার অ্যাপ্লিকেশনের বিভিন্ন অংশে ব্যবহৃত হবে।
- কনফিগারেশন পরিচালনা: সার্ভিস কনফিগারেশন ব্যবস্থাপনা সহজতর হয়, কারণ আপনি কনফিগারেশন ফাইলের মাধ্যমে সেটি পরিচালনা করতে পারেন।
- পুনঃব্যবহারযোগ্যতা: একবার পরিষেবা তৈরি করার পর এটি অ্যাপ্লিকেশনের যেকোনো স্থানে পুনরায় ব্যবহারযোগ্য।
সারাংশ
Phalcon ফ্রেমওয়ার্কে Service Providers তৈরি এবং কনফিগার করা একটি শক্তিশালী এবং কার্যকরী উপায়, যা অ্যাপ্লিকেশনের পরিষেবাগুলির মডুলার এবং পুনঃব্যবহারযোগ্য ব্যবস্থাপনা নিশ্চিত করে। DI কন্টেইনারের মাধ্যমে পরিষেবা নিবন্ধন, কনফিগারেশন এবং ব্যবহারের মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনটি আরও পরিষ্কার এবং রক্ষণাবেক্ষণযোগ্য করতে পারেন। Service Providers এর সাহায্যে, আপনি সহজে কাস্টম পরিষেবা তৈরি করতে পারেন যা আপনার অ্যাপ্লিকেশন এর বিভিন্ন অংশে ব্যবহৃত হবে।
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 ব্যবহার করে কাস্টম সার্ভিস এবং ক্লাসগুলির মধ্যে নির্ভরশীলতা ভালোভাবে পরিচালনা করা সম্ভব।
Phalcon ফ্রেমওয়ার্কে Dependency Injection (DI) একটি গুরুত্বপূর্ণ কনসেপ্ট যা অ্যাপ্লিকেশন ডেভেলপমেন্টকে আরও মডুলার, স্কেলেবল এবং রক্ষণাবেক্ষণযোগ্য করে তোলে। DI একটি ডিজাইন প্যাটার্ন যা ক্লাসগুলিকে তাদের নির্ভরতাগুলি (dependencies) সরবরাহ করতে সাহায্য করে, যাতে ক্লাসগুলিকে নিজস্ব নির্ভরতাগুলি তৈরি না করতে হয়। এর ফলে কোডের পুনঃব্যবহারযোগ্যতা এবং টেস্টেবিলিটি বৃদ্ধি পায়।
Phalcon এর DI কম্পোনেন্ট Object এবং Resource Management সহজ এবং কার্যকরী করে তোলে। এই কম্পোনেন্টের মাধ্যমে আপনি অ্যাপ্লিকেশনের বিভিন্ন ক্লাস এবং রিসোর্সের জীবনকাল এবং ব্যবহার নিয়ন্ত্রণ করতে পারেন।
Phalcon DI এবং Object Management
Phalcon ফ্রেমওয়ার্কে DI ব্যবহারের মাধ্যমে আপনি Objects এবং তাদের dependencies গুলিকে কিভাবে ইনজেক্ট এবং পরিচালনা করবেন তা খুব সহজভাবে করতে পারবেন। DI কন্টেইনারের মাধ্যমে, আপনি ক্লাসের ইনস্ট্যান্স তৈরি করার সময় নির্দিষ্ট সেটিংস বা কনফিগারেশন প্রদান করতে পারেন।
১. DI কন্টেইনার তৈরি করা
Phalcon-এ, DI কন্টেইনার তৈরি করা সাধারণত Phalcon\Di\FactoryDefault এর মাধ্যমে করা হয়, যা একটি ডিফল্ট কন্টেইনার সরবরাহ করে। এর মাধ্যমে আপনি সমস্ত সার্ভিস এবং ডিপেনডেন্সি রেজিস্টার করতে পারেন।
উদাহরণ:
use Phalcon\Di\FactoryDefault;
$di = new FactoryDefault();
এখানে, FactoryDefault DI কন্টেইনারটি ব্যবহার করা হচ্ছে, যা অ্যাপ্লিকেশন জুড়ে প্রয়োজনীয় সার্ভিসগুলো রাখতে সহায়ক হবে।
২. Object ইনজেকশন
আপনি DI কন্টেইনারের মাধ্যমে আপনার ক্লাসের ইনস্ট্যান্স সরবরাহ করতে পারেন। এর ফলে ক্লাসের নির্ভরতাগুলি স্বয়ংক্রিয়ভাবে ইনজেক্ট হবে।
উদাহরণ:
use Phalcon\Mvc\Controller;
class UsersController extends Controller
{
public function indexAction()
{
// DI কন্টেইনার থেকে একটি সার্ভিস বা অবজেক্ট ইনজেক্ট করা
$userService = $this->di->get('userService');
$userService->getUserDetails();
}
}
এখানে, userService কে DI কন্টেইনার থেকে get() মেথডের মাধ্যমে ইনজেক্ট করা হয়েছে।
৩. Service Register করা
যখন আপনি কোনো সার্ভিস বা অবজেক্ট DI কন্টেইনারে রেজিস্টার করেন, তখন আপনি সেটি যেকোনো ক্লাস বা কন্ট্রোলার থেকে সহজে অ্যাক্সেস করতে পারেন।
উদাহরণ:
use Phalcon\Di\FactoryDefault;
use Phalcon\Mvc\Application;
// DI কন্টেইনার তৈরি
$di = new FactoryDefault();
// কাস্টম সার্ভিস রেজিস্টার
$di->set('userService', function () {
return new UserService();
});
// অ্যাপ্লিকেশন তৈরি
$app = new Application($di);
$app->handle();
এখানে, userService সার্ভিস DI কন্টেইনারে রেজিস্টার করা হয়েছে এবং পরে সেটি অ্যাপ্লিকেশনে ব্যবহৃত হয়েছে।
Resource Management এবং DI
Phalcon DI শুধুমাত্র Object Management নয়, Resource Management-ও কার্যকরীভাবে পরিচালনা করতে সহায়ক। আপনি অ্যাপ্লিকেশনের বিভিন্ন রিসোর্স যেমন ডাটাবেস কানেকশন, ক্যাশিং, লগিং ইত্যাদি DI এর মাধ্যমে ইনজেক্ট এবং ম্যানেজ করতে পারেন। এটি অ্যাপ্লিকেশনের পারফরম্যান্স এবং স্কেলেবিলিটি উন্নত করতে সহায়ক।
১. Database Connection রেজিস্টার করা
Phalcon এর DI কন্টেইনার ব্যবহার করে ডাটাবেস কানেকশন ইনজেক্ট করা যায়, এবং আপনি ডাটাবেসের সংযোগ এবং তার জীবনকাল সহজে পরিচালনা করতে পারবেন।
উদাহরণ:
use Phalcon\Di\FactoryDefault;
use Phalcon\Db\Adapter\Pdo\Mysql as DbAdapter;
$di = new FactoryDefault();
// ডাটাবেস কানেকশন রেজিস্টার করা
$di->set('db', function () {
return new DbAdapter([
'host' => 'localhost',
'username' => 'root',
'password' => '',
'dbname' => 'phalcon_db'
]);
});
// ডাটাবেস সংযোগ ব্যবহার করা
$db = $di->get('db');
এখানে, DI কন্টেইনারের মাধ্যমে ডাটাবেস কানেকশন ইনজেক্ট করা হয়েছে, এবং পরে get() মেথডের মাধ্যমে ডাটাবেসের সাথে সংযোগ স্থাপন করা হয়েছে।
২. Caching এবং Logging এর জন্য DI ব্যবহার
Phalcon-এ বিভিন্ন রিসোর্স যেমন Caching এবং Logging-এর জন্য DI ব্যবহৃত হতে পারে। নিচে একটি উদাহরণ দেওয়া হলো:
// Caching রেজিস্টার করা
$di->set('cache', function () {
$frontCache = new \Phalcon\Cache\Frontend\Data(array('lifetime' => 86400));
$cache = new \Phalcon\Cache\Backend\File($frontCache, array(
'cacheDir' => '../app/cache/'
));
return $cache;
});
// Logging রেজিস্টার করা
$di->set('logger', function () {
return new \Phalcon\Logger\Adapter\File('../app/logs/application.log');
});
এখানে, cache এবং logger সার্ভিস দুটি DI কন্টেইনারে রেজিস্টার করা হয়েছে এবং পরবর্তীতে ব্যবহার করা যেতে পারে।
DI এর জীবনকাল (Lifecycle)
Phalcon-এ Dependency Injection এর মাধ্যমে, আপনি আপনার অবজেক্টগুলির জীবনকাল কাস্টমাইজ করতে পারেন। DI কন্টেইনারের মাধ্যমে সিঙ্গলটন (singleton) এবং নতুন ইনস্ট্যান্স তৈরি করা যায়।
১. Singleton ব্যবহার
Singleton এর মাধ্যমে, আপনি একটি একক ইনস্ট্যান্স তৈরি করেন এবং এটি অ্যাপ্লিকেশনের অন্যান্য অংশে শেয়ার করা হয়। এটা নিশ্চিত করে যে একেই অবজেক্ট একাধিকবার ইনস্ট্যান্সিয়েট না হয়।
$di->setShared('logger', function () {
return new \Phalcon\Logger\Adapter\File('../app/logs/application.log');
});
এখানে, setShared() মেথডের মাধ্যমে logger সার্ভিস সিঙ্গলটন হিসেবে রেজিস্টার করা হয়েছে।
২. নন-সিঙ্গলটন ব্যবহার
আপনি যদি চান যে একটি নতুন ইনস্ট্যান্স প্রতিবার তৈরি হোক, তবে set() মেথড ব্যবহার করতে পারেন।
$di->set('randomService', function () {
return new RandomService();
});
এখানে, প্রতিবার randomService কল করলে একটি নতুন ইনস্ট্যান্স তৈরি হবে।
সারাংশ
Phalcon এর Dependency Injection (DI) সিস্টেম অবজেক্ট এবং রিসোর্স ম্যানেজমেন্টকে সহজ করে তোলে। DI কন্টেইনারের মাধ্যমে আপনি অ্যাপ্লিকেশনের বিভিন্ন ক্লাস এবং রিসোর্সের জীবনকাল এবং নির্ভরতাগুলি কার্যকরভাবে পরিচালনা করতে পারেন। এটি অ্যাপ্লিকেশনের মডুলারিটি, স্কেলেবিলিটি এবং টেস্টেবিলিটি উন্নত করতে সহায়ক। DI এর মাধ্যমে আপনি সিঙ্গলটন এবং নন-সিঙ্গলটন অবজেক্ট ম্যানেজমেন্ট সহ বিভিন্ন রিসোর্স যেমন ডাটাবেস কানেকশন, ক্যাশিং, লগিং ইত্যাদির পরিচালনাও করতে পারেন।
Read more