Zend Framework (এখন Laminas) এ কাস্টম সার্ভিস তৈরি এবং ব্যবহারের মাধ্যমে আপনি অ্যাপ্লিকেশনটির কার্যক্ষমতা এবং কার্যক্রম আরও মোডুলার এবং পুনঃব্যবহারযোগ্য করতে পারেন। কাস্টম সার্ভিসগুলি বিভিন্ন কাজ যেমন ডাটাবেস এক্সেস, API কল, লগিং, ইউটিলিটি ফাংশন ইত্যাদি একক অবস্থান থেকে সঞ্চালিত হতে পারে, যা অ্যাপ্লিকেশনটিকে আরও সংগঠিত এবং কার্যকরী করে তোলে।
Zend Framework এ কাস্টম সার্ভিস তৈরি এবং ব্যবহারের জন্য Service Manager ব্যবহার করা হয়, যা ডিপেনডেন্সি ইনজেকশন (DI) এর মাধ্যমে সার্ভিসগুলোকে ইনজেক্ট করে।
১. কাস্টম সার্ভিস তৈরি করা
কাস্টম সার্ভিস তৈরি করার জন্য প্রথমে একটি ক্লাস তৈরি করতে হবে, যা আপনার সার্ভিসের ফাংশনালিটি প্রদান করবে। ধরুন আমরা একটি LoggerService নামক সার্ভিস তৈরি করতে যাচ্ছি যা লগ মেসেজ স্টোর করবে।
ক্লাস তৈরি:
namespace Application\Service;
class LoggerService
{
protected $logFile;
public function __construct($logFile)
{
$this->logFile = $logFile;
}
public function log($message)
{
file_put_contents($this->logFile, $message . PHP_EOL, FILE_APPEND);
}
}
এখানে, LoggerService ক্লাসটি একটি লগ ফাইলের পাথ নেবে এবং log মেথডটি লগ মেসেজ লিখবে সেই ফাইলে।
২. সার্ভিস ম্যানেজারে সার্ভিস রেজিস্টার করা
একবার কাস্টম সার্ভিস তৈরি হলে, এটি Service Manager-এ রেজিস্টার করতে হবে, যাতে এটি অ্যাপ্লিকেশনের যেকোনো অংশ থেকে সহজে ব্যবহার করা যায়।
module.config.php ফাইলে সার্ভিস রেজিস্টার করা হয়।
namespace Application;
use Laminas\Mvc\ModuleRouteListener;
use Laminas\Mvc\MvcEvent;
class Module
{
public function getServiceConfig()
{
return [
'factories' => [
'Application\Service\LoggerService' => function($container) {
return new \Application\Service\LoggerService('/path/to/logfile.log');
},
],
];
}
}
এখানে, getServiceConfig মেথডে আমরা একটি factory ব্যবহার করছি যাতে সার্ভিস তৈরি হবে। সার্ভিসের ডিপেনডেন্সি হিসেবে আমরা লগ ফাইলের পাথ পাস করছি।
৩. কাস্টম সার্ভিস ব্যবহার করা
কাস্টম সার্ভিস ব্যবহারের জন্য সার্ভিস ম্যানেজার থেকে সার্ভিসটি ইনজেক্ট করা হয়। এটি কন্ট্রোলার বা অন্যান্য ক্লাসে ব্যবহার করা যেতে পারে।
কন্ট্রোলার থেকে কাস্টম সার্ভিস ব্যবহার:
namespace Application\Controller;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
use Application\Service\LoggerService;
class IndexController extends AbstractActionController
{
protected $loggerService;
public function __construct(LoggerService $loggerService)
{
$this->loggerService = $loggerService;
}
public function indexAction()
{
// লগ মেসেজ লিখুন
$this->loggerService->log("User accessed the homepage.");
return new ViewModel();
}
}
এখানে, কন্ট্রোলারে LoggerService ইনজেক্ট করা হয়েছে। indexAction মেথডে, ব্যবহারকারী যখন হোমপেজে প্রবেশ করেন, তখন একটি লগ মেসেজ স্টোর করা হচ্ছে।
৪. সার্ভিস ম্যানেজার ব্যবহার করে কাস্টম সার্ভিস ইনজেক্ট করা
Zend Framework (Laminas) এর সার্ভিস ম্যানেজারটি স্বয়ংক্রিয়ভাবে আপনার সার্ভিস ইনজেক্ট করতে সক্ষম, যদি আপনি constructor injection ব্যবহার করেন। তবে, কখনও কখনও আপনি কন্ট্রোলারের __construct মেথডে সার্ভিস ইনজেক্ট করতে চান না, তখন আপনি সার্ভিস ম্যানেজার ব্যবহার করে সার্ভিসটি নিতে পারেন।
Service Manager থেকে কাস্টম সার্ভিস গ্রহণ:
namespace Application\Controller;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
use Application\Service\LoggerService;
class IndexController extends AbstractActionController
{
public function indexAction()
{
// সার্ভিস ম্যানেজার থেকে সার্ভিস গ্রহণ
$loggerService = $this->getServiceLocator()->get('Application\Service\LoggerService');
$loggerService->log("User accessed the homepage.");
return new ViewModel();
}
}
এখানে getServiceLocator()->get() মেথড ব্যবহার করে আমরা সরাসরি সার্ভিস ম্যানেজার থেকে LoggerService ইনস্ট্যান্স নিচ্ছি এবং লগ মেসেজ লিখছি।
৫. ডিপেনডেন্সি ইনজেকশন (Dependency Injection)
Zend Framework এ ডিপেনডেন্সি ইনজেকশন ব্যবহার করা হয়, যার মাধ্যমে সার্ভিস ম্যানেজার সার্ভিসগুলোকে কন্ট্রোলারে ইনজেক্ট করে। এটি কোডের পুনঃব্যবহারযোগ্যতা, টেস্টেবলিটি এবং অ্যাপ্লিকেশনের স্থিতিস্থাপকতা বৃদ্ধি করে।
ডিপেনডেন্সি ইনজেকশন সাধারণত দুটি ধাপে ঘটে:
- Constructor Injection: যখন সার্ভিসটি কন্ট্রোলারের কনস্ট্রাক্টর মেথডে ইনজেক্ট করা হয়।
- Setter Injection: যখন একটি মেথড ব্যবহার করে সার্ভিস ইনজেক্ট করা হয়।
৬. সার্ভিসের ডিপেনডেন্সি
কাস্টম সার্ভিসের যদি অন্য সার্ভিস বা ডিপেনডেন্সি থাকে, তবে সেগুলিও ইনজেক্ট করা যায়।
ধরা যাক, আমাদের LoggerService এর ভিতরে একটি EmailService রয়েছে যেটি ব্যবহার করে লগ মেসেজ পাঠানো হবে।
LoggerService এর ডিপেনডেন্সি সহ:
namespace Application\Service;
class LoggerService
{
protected $logFile;
protected $emailService;
public function __construct($logFile, EmailService $emailService)
{
$this->logFile = $logFile;
$this->emailService = $emailService;
}
public function log($message)
{
file_put_contents($this->logFile, $message . PHP_EOL, FILE_APPEND);
$this->emailService->sendLogEmail($message); // লগ মেসেজ ইমেইল করা
}
}
এখানে, LoggerService এর ভিতরে একটি EmailService ইনজেক্ট করা হয়েছে যা লগ মেসেজ ইমেইল করার কাজ করবে।
সার্ভিসের ডিপেনডেন্সি রেজিস্টার করা:
namespace Application;
use Laminas\Mvc\ModuleRouteListener;
use Laminas\Mvc\MvcEvent;
class Module
{
public function getServiceConfig()
{
return [
'factories' => [
'Application\Service\EmailService' => function($container) {
return new \Application\Service\EmailService();
},
'Application\Service\LoggerService' => function($container) {
$emailService = $container->get('Application\Service\EmailService');
return new \Application\Service\LoggerService('/path/to/logfile.log', $emailService);
},
],
];
}
}
এখানে, LoggerService তৈরি করতে EmailService ডিপেনডেন্সি ইনজেক্ট করা হচ্ছে।
সারাংশ
Zend Framework (Laminas) এ কাস্টম সার্ভিস তৈরি এবং ব্যবহারের মাধ্যমে অ্যাপ্লিকেশনটি আরও মোডুলার এবং স্কেলেবল হয়ে ওঠে। সার্ভিস ম্যানেজার ব্যবহার করে সার্ভিস রেজিস্টার এবং ইনজেক্ট করা যায়। এটি ডিপেনডেন্সি ইনজেকশন ব্যবহার করে এবং আপনাকে কোড পুনঃব্যবহারযোগ্য, টেস্টেবল এবং আরও সুষ্ঠু ভাবে পরিচালনা করতে সাহায্য করে।
Read more