Zend Framework বা Laminas এ টেবিল গেটওয়ে প্যাটার্ন একটি জনপ্রিয় ডিজাইন প্যাটার্ন, যা ডাটাবেস টেবিলের সাথে ইন্টারঅ্যাকশন সহজ করে। এই প্যাটার্নটি একটি গেটওয়ে ক্লাস ব্যবহার করে ডাটাবেসের সাথে সমস্ত যোগাযোগ পরিচালনা করে, যা অ্যাপ্লিকেশনের ডাটাবেস অপারেশনগুলিকে মডুলার এবং পুনঃব্যবহারযোগ্য করে তোলে। টেবিল গেটওয়ে প্যাটার্নের মাধ্যমে আপনি ডাটাবেস অপারেশনগুলোকে অ্যাপ্লিকেশনের লজিক থেকে আলাদা রাখতে পারেন, যা রক্ষণাবেক্ষণ ও স্কেলেবিলিটি সহজ করে তোলে।
টেবিল গেটওয়ে প্যাটার্নের মূল ধারণা
টেবিল গেটওয়ে প্যাটার্নে একটি ক্লাস (গেটওয়ে) ডাটাবেস টেবিলের সব CRUD (Create, Read, Update, Delete) অপারেশন হ্যান্ডেল করে। এই গেটওয়ে ক্লাসটি সাধারণত ডাটাবেস টেবিলের একেকটি রেকর্ডের সাথে ইন্টারঅ্যাক্ট করে, এবং ডাটাবেসের কাজগুলো অ্যাপ্লিকেশনের অন্যান্য অংশ থেকে আলাদা রাখে।
গেটওয়ে ক্লাসটি সাধারণত একটি একক টেবিলের জন্য কাজ করে এবং ডাটাবেসের প্রতিটি রেকর্ডকে একটি Entity বা Model অবজেক্ট হিসেবে রিপ্রেজেন্ট করে। টেবিল গেটওয়ে প্যাটার্নটি মূলত ডাটাবেসের সাথে যোগাযোগকে সহজ এবং মডুলার করে তোলে।
টেবিল গেটওয়ে প্যাটার্নের ব্যবহার
Zend Framework বা Laminas এ টেবিল গেটওয়ে প্যাটার্ন ব্যবহারের জন্য সাধারণভাবে যে স্টেপগুলো অনুসরণ করতে হয় তা নিচে আলোচনা করা হলো:
- গেটওয়ে ক্লাস তৈরি: টেবিলের জন্য একটি গেটওয়ে ক্লাস তৈরি করা হয়, যা ডাটাবেস টেবিলের সাথে সমস্ত যোগাযোগের জন্য দায়ী হবে।
- মডেল বা এন্টিটি তৈরি: ডাটাবেস টেবিলের রেকর্ডের জন্য একটি মডেল বা এন্টিটি ক্লাস তৈরি করা হয়, যা টেবিলের কলামগুলিকে রিপ্রেজেন্ট করবে।
- গেটওয়ে ক্লাসের মাধ্যমে ডাটাবেস অপারেশন: CRUD অপারেশনগুলো গেটওয়ে ক্লাসের মাধ্যমে করা হয়।
উদাহরণ: টেবিল গেটওয়ে প্যাটার্ন ব্যবহার করা
ধরা যাক, আমাদের একটি Product টেবিল রয়েছে, এবং আমরা সেটির জন্য টেবিল গেটওয়ে প্যাটার্ন ব্যবহার করতে চাই।
১. Product Model (এন্টিটি) তৈরি করা
প্রথমে একটি Product মডেল ক্লাস তৈরি করতে হবে, যা ডাটাবেস টেবিলের কলামগুলিকে রিপ্রেজেন্ট করবে।
src/Model/Product.php:
<?php
namespace Application\Model;
class Product
{
public $id;
public $name;
public $price;
public function exchangeArray(array $data)
{
$this->id = (isset($data['id'])) ? $data['id'] : null;
$this->name = (isset($data['name'])) ? $data['name'] : null;
$this->price = (isset($data['price'])) ? $data['price'] : null;
}
}
এই Product ক্লাসটি ডাটাবেস টেবিলের প্রতিটি রেকর্ডের জন্য ডাটা ধারণ করে। exchangeArray() মেথডটি ব্যবহার করা হয় ডাটাবেসের রেকর্ডকে মডেল অবজেক্টে ম্যাপ করার জন্য।
২. ProductTable গেটওয়ে ক্লাস তৈরি করা
এখন একটি ProductTable ক্লাস তৈরি করতে হবে, যা টেবিল গেটওয়ে হিসেবে কাজ করবে এবং ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করবে। এই ক্লাসটি Zend\Db\Adapter\Adapter বা Laminas\Db\Adapter\Adapter ব্যবহার করবে ডাটাবেস কানেকশন এবং সেখান থেকে ডাটা ফেচ করবে।
src/Model/ProductTable.php:
<?php
namespace Application\Model;
use Laminas\Db\TableGateway\TableGatewayInterface;
class ProductTable
{
protected $tableGateway;
public function __construct(TableGatewayInterface $tableGateway)
{
$this->tableGateway = $tableGateway;
}
public function fetchAll()
{
$resultSet = $this->tableGateway->select();
return $resultSet;
}
public function getProduct($id)
{
$rowset = $this->tableGateway->select(['id' => (int) $id]);
$row = $rowset->current();
if (!$row) {
throw new \Exception("Could not find row $id");
}
return $row;
}
public function saveProduct(Product $product)
{
$data = [
'name' => $product->name,
'price' => $product->price,
];
$id = (int) $product->id;
if ($id == 0) {
$this->tableGateway->insert($data);
} else {
if ($this->getProduct($id)) {
$this->tableGateway->update($data, ['id' => $id]);
} else {
throw new \Exception('Product id does not exist');
}
}
}
public function deleteProduct($id)
{
$this->tableGateway->delete(['id' => (int) $id]);
}
}
এই ProductTable ক্লাসটি টেবিল গেটওয়ে হিসেবে কাজ করছে এবং fetchAll(), getProduct(), saveProduct(), deleteProduct() মেথডের মাধ্যমে CRUD অপারেশনগুলো পরিচালনা করছে।
৩. Module.php এবং ServiceManager কনফিগারেশন
এখন আমাদের ProductTable ক্লাসটি ServiceManager এর মাধ্যমে অ্যাপ্লিকেশনে ব্যবহারযোগ্য করে তুলতে হবে। Module.php ফাইলে আমরা সঠিক কনফিগারেশন করে দেবো।
module/Application/Module.php:
<?php
namespace Application;
use Laminas\ModuleManager\Feature\ConfigProviderInterface;
use Laminas\ModuleManager\Feature\ServiceProviderInterface;
use Laminas\ServiceManager\ServiceManager;
use Application\Model\ProductTable;
use Laminas\Db\Adapter\Adapter;
use Laminas\Db\TableGateway\TableGateway;
class Module implements ConfigProviderInterface, ServiceProviderInterface
{
public function getServiceConfig()
{
return [
'factories' => [
ProductTable::class => function($container) {
$tableGateway = $container->get(TableGateway::class);
return new ProductTable($tableGateway);
},
TableGateway::class => function($container) {
$dbAdapter = $container->get(Adapter::class);
return new TableGateway('product', $dbAdapter);
},
Adapter::class => function() {
return new Adapter([
'driver' => 'Pdo_Mysql',
'database' => 'test',
'username' => 'root',
'password' => '',
]);
},
],
];
}
}
এখানে, আমরা TableGateway এবং ProductTable ক্লাসকে ServiceManager এ রেজিস্টার করেছি যাতে অ্যাপ্লিকেশনের অন্যান্য অংশে সেগুলো সহজে ব্যবহার করা যায়।
৪. Controller এ ProductTable ব্যবহার করা
এখন আমরা ProductTable ক্লাসটি আমাদের কন্ট্রোলারে ব্যবহার করতে পারব। উদাহরণস্বরূপ, ProductController এর মধ্যে ডাটাবেস থেকে পণ্য তথ্য ফেচ করতে হবে।
src/Controller/ProductController.php:
<?php
namespace Application\Controller;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
use Application\Model\ProductTable;
class ProductController extends AbstractActionController
{
protected $productTable;
public function __construct(ProductTable $productTable)
{
$this->productTable = $productTable;
}
public function indexAction()
{
$products = $this->productTable->fetchAll();
return new ViewModel([
'products' => $products,
]);
}
public function addAction()
{
// পণ্য যোগ করার জন্য প্রক্রিয়া
}
}
এখানে, আমরা ProductTable ক্লাসটি কনস্ট্রাকটরে ইনজেক্ট করেছি এবং indexAction মেথডে fetchAll() মেথডের মাধ্যমে সমস্ত পণ্য তথ্য ভিউতে পাঠিয়েছি।
সারাংশ
Zend Framework বা Laminas এ টেবিল গেটওয়ে প্যাটার্ন ব্যবহারের মাধ্যমে ডাটাবেসের সাথে ইন্টারঅ্যাকশন আরও মডুলার এবং স্কেলেবল হয়। ProductTable গেটওয়ে ক্লাসটি ডাটাবেস অপারেশনগুলো পরিচালনা করে এবং Product মডেলটি ডাটাবেস টেবিলের রেকর্ডগুলিকে রিপ্রেজেন্ট করে।
এই প্যাটার্নের মাধ্যমে অ্যাপ্লিকেশনটির ডাটাবেস সম্পর্কিত লজিক এবং অ্যাপ্লিকেশনের অন্যান্য অংশের লজিককে আলাদা রাখা সম্ভব হয়।
Read more