Models এবং Database Interaction

জেন্ড ফ্রেমওয়ার্ক (Zend Framework) - Web Development

260

Zend Framework (এখন Laminas) একটি শক্তিশালী PHP ফ্রেমওয়ার্ক, যা MVC (Model-View-Controller) আর্কিটেকচার অনুসরণ করে। এই ফ্রেমওয়ার্কে Model প্রধানত ডাটাবেসের সাথে যোগাযোগের জন্য ব্যবহৃত হয়। মডেল একটি ক্লাস হিসেবে কাজ করে যা ডাটাবেস থেকে ডাটা সংগ্রহ, প্রক্রিয়া করা এবং রিটার্ন করা সহ বিভিন্ন কার্যকলাপ পরিচালনা করে।

এই টিউটোরিয়ালে আমরা Zend Framework (Laminas) এ মডেল তৈরির এবং ডাটাবেস ইন্টারঅ্যাকশন কিভাবে পরিচালনা করা হয়, তা দেখবো।


১. Zend Framework এ Model তৈরি করা

Zend Framework বা Laminas এ মডেল তৈরির জন্য সাধারণত একটি ক্লাস তৈরি করা হয়, যা ডাটাবেস বা ব্যবসায়িক লজিকের সাথে সম্পর্কিত কার্যক্রম পরিচালনা করে।

ধরা যাক, আমরা একটি Product মডেল তৈরি করছি, যা পণ্যের তথ্য ডাটাবেস থেকে রিট্রিভ করবে।

Product.php মডেল ক্লাস উদাহরণ:

namespace Application\Model;

use Laminas\Db\TableGateway\TableGateway;

class Product
{
    protected $tableGateway;

    public function __construct(TableGateway $tableGateway)
    {
        $this->tableGateway = $tableGateway;
    }

    public function fetchAll()
    {
        return $this->tableGateway->select();
    }

    public function getProduct($id)
    {
        $id = (int) $id;
        $resultSet = $this->tableGateway->select(['id' => $id]);
        $row = $resultSet->current();
        if (!$row) {
            throw new \Exception("Could not find row $id");
        }
        return $row;
    }
}

এই মডেলটি TableGateway ব্যবহার করে ডাটাবেসের সাথে যোগাযোগ করে। TableGateway একটি বিশেষ ক্লাস যা ডাটাবেস টেবিলের সাথে সহজে কাজ করতে সাহায্য করে।


২. Zend Framework এ Database Interaction

Zend Framework এ ডাটাবেস ইন্টারঅ্যাকশন সাধারণত Zend\Db কম্পোনেন্টের মাধ্যমে করা হয়। TableGateway একটি খুবই জনপ্রিয় ক্লাস যেটি ডাটাবেস টেবিলের উপর CRUD (Create, Read, Update, Delete) অপারেশন পরিচালনা করতে ব্যবহার করা হয়।

Zend\Db\TableGateway\TableGateway

TableGateway ক্লাসটি একটি টেবিলের সাথে কাজ করার জন্য ব্যবহৃত হয়, যেমন ডাটাবেস থেকে ডাটা সংগ্রহ বা টেবিলের ডাটা আপডেট বা ডিলিট করা। এটি ডাটাবেসের সাথে যোগাযোগের জন্য ORM (Object Relational Mapper)-এর মতো কাজ করে, কিন্তু এটি আরো সরল ও ডিরেক্ট পদ্ধতিতে কাজ করে।

TableGateway এর সাথে CRUD অপারেশন
  1. Create (Create Record)
public function addProduct($data)
{
    $this->tableGateway->insert($data);
}

এই মেথডটি নতুন একটি রেকর্ড ডাটাবেসে ইনসার্ট করবে।

  1. Read (Read Data)
public function fetchAll()
{
    return $this->tableGateway->select();
}

এই মেথডটি টেবিলের সমস্ত ডাটা রিটার্ন করবে।

  1. Update (Update Record)
public function updateProduct($id, $data)
{
    $this->tableGateway->update($data, ['id' => $id]);
}

এই মেথডটি নির্দিষ্ট আইডির রেকর্ড আপডেট করবে।

  1. Delete (Delete Record)
public function deleteProduct($id)
{
    $this->tableGateway->delete(['id' => $id]);
}

এই মেথডটি নির্দিষ্ট আইডির রেকর্ড ডিলিট করবে।


৩. Database Connection কনফিগারেশন

Zend Framework এ ডাটাবেসের সাথে সংযোগ করতে আপনাকে প্রথমে ডাটাবেস কনফিগারেশন করতে হবে। ডাটাবেস কনফিগারেশন সাধারণত config/autoload/global.php বা config/autoload/local.php ফাইলে রাখা হয়।

global.php কনফিগারেশন উদাহরণ:

return [
    'db' => [
        'driver' => 'Pdo',
        'dsn' => 'mysql:dbname=testdb;host=localhost',
        'username' => 'root',
        'password' => '',
        'driver_options' => [
            \PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
        ],
    ],
];

এখানে dsn (Data Source Name) এবং অন্যান্য ডাটাবেস ক্রেডেনশিয়ালস (যেমন ইউজারনেম এবং পাসওয়ার্ড) সেট করা হয়েছে।


৪. Zend Framework এ TableGateway ইনজেকশন

TableGateway একটি ডিপেন্ডেন্সি ইনজেকশন প্যাটার্ন ব্যবহার করে কাজ করে। এটির জন্য আপনাকে Module.php ফাইলে Service Manager কনফিগারেশন করতে হবে, যাতে আপনার মডেলগুলো যথাযথভাবে ডাটাবেস কানেকশন ইনজেক্ট করতে পারে।

Module.php কনফিগারেশন উদাহরণ:

namespace Application;

use Laminas\Db\Adapter\Adapter;
use Laminas\Db\TableGateway\TableGateway;
use Laminas\ServiceManager\Factory\InvokableFactory;

class Module
{
    public function getServiceConfig()
    {
        return [
            'factories' => [
                TableGateway::class => function ($container) {
                    $dbAdapter = $container->get(Adapter::class);
                    return new TableGateway('product', $dbAdapter);
                },
                'Application\Model\Product' => function ($container) {
                    $tableGateway = $container->get(TableGateway::class);
                    return new \Application\Model\Product($tableGateway);
                },
            ],
        ];
    }
}

এখানে Product মডেলটি TableGateway কে ইনজেক্ট করা হয়েছে। ServiceManager এর মাধ্যমে TableGateway তৈরি করা হয়, এবং তা Product মডেলে ইনজেক্ট করা হয়।


৫. Controller এবং Model এর সাথে ইন্টিগ্রেশন

আপনার কন্ট্রোলার থেকে মডেল ব্যবহার করতে হবে, যাতে ডাটাবেস থেকে ডাটা রিট্রিভ বা আপডেট করা যায়।

ProductController.php:

namespace Application\Controller;

use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
use Application\Model\Product;

class ProductController extends AbstractActionController
{
    protected $productTable;

    public function __construct(Product $productTable)
    {
        $this->productTable = $productTable;
    }

    public function indexAction()
    {
        $products = $this->productTable->fetchAll();
        return new ViewModel([
            'products' => $products
        ]);
    }

    public function addAction()
    {
        // নতুন পণ্য যোগ করার জন্য ফর্ম ডেটা প্রসেস করা
        $this->productTable->addProduct(['name' => 'New Product', 'price' => 100]);
        return $this->redirect()->toRoute('product');
    }
}

এই কন্ট্রোলারে আমরা Product মডেলকে ইনজেক্ট করেছি এবং fetchAll()addProduct() মেথডগুলির মাধ্যমে ডাটাবেসের সাথে যোগাযোগ করছি।


সারাংশ

Zend Framework বা Laminas এ মডেল এবং ডাটাবেস ইন্টারঅ্যাকশন তৈরি করতে TableGateway ক্লাস ব্যবহার করা হয়, যা ডাটাবেসের সাথে CRUD অপারেশন সহজে সম্পাদন করতে সাহায্য করে। মডেলটি ডাটাবেস থেকে ডাটা রিট্রিভ, ইনসার্ট, আপডেট এবং ডিলিট করার জন্য ব্যবহৃত হয়, এবং এটি সাধারণত TableGateway এর মাধ্যমে ডাটাবেস অপারেশন পরিচালনা করে। এছাড়াও, মডেলটি ডিপেন্ডেন্সি ইনজেকশন প্যাটার্ন ব্যবহার করে কন্ট্রোলারে ইনজেক্ট করা হয়, যাতে ডাটাবেসের সাথে যোগাযোগ করা যায়।

Content added By

Zend Framework (এখন Laminas) এ Zend\Db মডিউল একটি শক্তিশালী এবং নমনীয় ডাটাবেস অ্যাবস্ট্রাকশন লেয়ারের (Database Abstraction Layer) কাজ করে, যা ডাটাবেসের সাথে ইন্টারঅ্যাকশন সহজ করে তোলে। এটি বিভিন্ন ডাটাবেস সার্ভার যেমন MySQL, PostgreSQL, SQLite, MSSQL ইত্যাদির সাথে কাজ করতে সক্ষম। Zend\Db একটি উচ্চমানের API প্রদান করে, যা ডাটাবেস অপারেশনগুলি পরিচালনা এবং উন্নত কুইরি তৈরি করতে সাহায্য করে।

Zend\Db মডিউলটি অনেক গুরুত্বপূর্ণ ফিচারের সাথে আসে, যেমন:

  • ডাটাবেস কানেকশন: ডাটাবেসের সাথে কানেক্ট করতে বিভিন্ন অপশন প্রদান করা।
  • কুইরি বিল্ডার: SQL কুইরি তৈরি করার জন্য একটি সহজ এবং শক্তিশালী টুল।
  • ডাটাবেস ট্রানজ্যাকশন: একাধিক অপারেশন একসাথে সঞ্চালন এবং তাদের নিরাপত্তা নিশ্চিত করা।
  • রেজাল্ট সেট ম্যানেজমেন্ট: ডাটাবেস থেকে পাওয়া রেজাল্ট সেটগুলিকে সহজে হ্যান্ডেল করা।
  • এন্টিটি (Entity) ও মডেল ব্যবস্থাপনা: ডাটাবেস থেকে পাওয়া ডাটা অবজেক্ট হিসেবে প্রক্রিয়া করা।

Zend\Db মডিউলটি একটি আধুনিক ডাটাবেস API প্রদান করে, যা পিএইচপি ডেভেলপারদের জন্য ডাটাবেসের সাথে কাজ করা অনেক সহজ করে তোলে।


Zend\Db এর প্রধান উপাদান

Zend\Db মডিউলটি কয়েকটি প্রধান উপাদান নিয়ে কাজ করে, যার মাধ্যমে ডাটাবেসের সাথে যোগাযোগ সহজ হয়:

  1. Zend\Db\Adapter: ডাটাবেসের সাথে সংযোগ স্থাপন এবং ডাটা চালনা করার জন্য অ্যাডাপ্টার।
  2. Zend\Db\Sql: SQL কুইরি তৈরি এবং সম্পাদনার জন্য ব্যবহার করা হয়।
  3. Zend\Db\ResultSet: ডাটাবেস থেকে প্রাপ্ত রেজাল্ট সেটগুলি হ্যান্ডেল করার জন্য।
  4. Zend\Db\TableGateway: ডাটাবেস টেবিলের সাথে যোগাযোগ এবং CRUD অপারেশন সহজ করার জন্য।
  5. Zend\Db\Profiler: SQL কুইরি এবং তাদের এক্সিকিউশন টাইম ট্র্যাকিং করতে সাহায্য করে।

Zend\Db অ্যাডাপ্টার

Zend\Db এর Adapter একটি গুরুত্বপূর্ণ উপাদান, যা ডাটাবেসের সাথে সংযোগ স্থাপন এবং SQL কুইরি এক্সিকিউট করার জন্য ব্যবহৃত হয়। এর মাধ্যমে ডাটাবেস কানেকশনের সেটিংস এবং কনফিগারেশন করা হয়।

Adapter কনফিগারেশন উদাহরণ:

use Zend\Db\Adapter\Adapter;

$config = [
    'driver'   => 'Pdo_Mysql',
    'hostname' => 'localhost',
    'database' => 'test_db',
    'username' => 'root',
    'password' => '',
];

$adapter = new Adapter($config);

এখানে Pdo_Mysql ড্রাইভার ব্যবহার করা হয়েছে, এবং ডাটাবেস কানেকশন জন্য সমস্ত প্রয়োজনীয় তথ্য প্রদান করা হয়েছে। এই অ্যাডাপ্টারের মাধ্যমে আপনি SQL কুইরি এক্সিকিউট করতে পারবেন।


Zend\Db\Sql

Zend\Db\Sql ব্যবহার করে আপনি SQL কুইরি তৈরি করতে পারেন। এটি কুইরি গঠন সহজ করে তোলে এবং SQL ইনজেকশন আক্রমণ থেকে সুরক্ষা প্রদান করে।

SQL কুইরি বিল্ডার উদাহরণ:

use Zend\Db\Sql\Sql;
use Zend\Db\Adapter\Adapter;

$adapter = new Adapter([
    'driver' => 'Pdo_Mysql',
    'database' => 'test_db',
    'username' => 'root',
    'password' => '',
]);

$sql = new Sql($adapter);
$select = $sql->select('products'); // টেবিলের নাম 'products'
$select->columns(['id', 'name', 'price']); // প্রয়োজনীয় কলামসমূহ

$statement = $sql->prepareStatementForSqlObject($select);
$result = $statement->execute();

এই কোডে, Sql ক্লাসটি একটি select কুইরি তৈরি করেছে, যা products টেবিলের id, name, এবং price কলামগুলো নির্বাচিত করবে।


Zend\Db\TableGateway

Zend\Db\TableGateway ক্লাসটি ডাটাবেস টেবিলের সাথে ইন্টারঅ্যাকশনের জন্য সহজ উপায় সরবরাহ করে। এটি টেবিলের ডাটা নিয়ে কাজ করা, যেমন ইন্সার্ট, আপডেট, ডিলিট এবং সিলেক্ট করা সহজ করে তোলে।

TableGateway উদাহরণ:

use Zend\Db\TableGateway\TableGateway;

$adapter = new Adapter([
    'driver' => 'Pdo_Mysql',
    'database' => 'test_db',
    'username' => 'root',
    'password' => '',
]);

$tableGateway = new TableGateway('products', $adapter);
$result = $tableGateway->select();  // সমস্ত পণ্য ডাটা সিলেক্ট করা
foreach ($result as $row) {
    echo $row['name'] . ' - ' . $row['price'] . PHP_EOL;
}

এখানে TableGateway ব্যবহার করে products টেবিল থেকে ডাটা সিলেক্ট করা হয়েছে। এটি ডাটাবেসের সাথে সহজে CRUD অপারেশন পরিচালনা করতে সক্ষম।


Zend\Db\ResultSet

Zend\Db\ResultSet রেজাল্ট সেট ম্যানেজমেন্টের জন্য ব্যবহৃত হয়। এটি ডাটাবেস থেকে প্রাপ্ত রেকর্ডের সেটের সাথে কাজ করার জন্য একটি অত্যন্ত উপকারী টুল। এটি ডাটাবেসের রেজাল্টগুলিকে একটি নির্দিষ্ট অবজেক্ট ফরম্যাটে পরিণত করতে পারে।

ResultSet উদাহরণ:

use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;

$tableGateway = new TableGateway('products', $adapter);
$resultSet = $tableGateway->select();
foreach ($resultSet as $row) {
    echo $row['name'] . ' - ' . $row['price'] . PHP_EOL;
}

এখানে ResultSet ব্যবহার করে সিলেক্ট করা রেকর্ডগুলো পড়া হচ্ছে। এটি ডাটাবেস থেকে পাওয়া রেকর্ডগুলোকে সহজে প্রক্রিয়া এবং রিটার্ন করতে সাহায্য করে।


Zend\Db ট্রানজ্যাকশন

Zend\Db এর ট্রানজ্যাকশন ফিচারটি একাধিক ডাটাবেস অপারেশনকে একটি একক ব্লকে আবদ্ধ করতে ব্যবহৃত হয়, যা পুরো অপারেশনটি সফল না হলে সম্পূর্ণভাবে ব্যর্থ হয়ে যাবে। এটি ডাটাবেসের ইনটিগ্রিটি বজায় রাখতে সহায়তা করে।

ট্রানজ্যাকশন উদাহরণ:

use Zend\Db\Adapter\Adapter;

$adapter = new Adapter([
    'driver' => 'Pdo_Mysql',
    'database' => 'test_db',
    'username' => 'root',
    'password' => '',
]);

$adapter->getDriver()->getConnection()->beginTransaction();
try {
    // প্রথম অপারেশন
    $adapter->query('INSERT INTO products (name, price) VALUES ("Product1", 100)', Adapter::QUERY_MODE_EXECUTE);
    
    // দ্বিতীয় অপারেশন
    $adapter->query('INSERT INTO products (name, price) VALUES ("Product2", 150)', Adapter::QUERY_MODE_EXECUTE);
    
    // সবকিছু সফল হলে কমিট করা
    $adapter->getDriver()->getConnection()->commit();
} catch (\Exception $e) {
    // যদি কোন সমস্যা হয়, রোলব্যাক করা
    $adapter->getDriver()->getConnection()->rollback();
}

এখানে দুটি INSERT অপারেশন একটি ট্রানজ্যাকশনে আচ্ছাদিত হয়েছে। যদি কোন এক অপারেশন ব্যর্থ হয়, তাহলে পুরো ট্রানজ্যাকশন রোলব্যাক হবে এবং কোনো পরিবর্তন ডাটাবেসে কার্যকর হবে না।


সারাংশ

Zend\Db মডিউলটি ডাটাবেস অপারেশনকে সহজ এবং নিরাপদ করে তোলে। এর মাধ্যমে ডাটাবেসের সাথে কানেকশন স্থাপন, SQL কুইরি তৈরি, ডাটা ম্যানিপুলেশন, ট্রানজ্যাকশন পরিচালনা এবং রেজাল্ট সেট ম্যানেজমেন্ট সহজ হয়। Zend\Db এর অনেক উপাদান, যেমন Adapter, Sql, TableGateway, ResultSet, এবং ট্রানজ্যাকশন ফিচারগুলির মাধ্যমে পিএইচপি ডেভেলপাররা শক্তিশালী এবং স্কেলেবল ডাটাবেস সমাধান তৈরি করতে পারেন।

Content added By

Zend Framework বা Laminas এ টেবিল গেটওয়ে প্যাটার্ন একটি জনপ্রিয় ডিজাইন প্যাটার্ন, যা ডাটাবেস টেবিলের সাথে ইন্টারঅ্যাকশন সহজ করে। এই প্যাটার্নটি একটি গেটওয়ে ক্লাস ব্যবহার করে ডাটাবেসের সাথে সমস্ত যোগাযোগ পরিচালনা করে, যা অ্যাপ্লিকেশনের ডাটাবেস অপারেশনগুলিকে মডুলার এবং পুনঃব্যবহারযোগ্য করে তোলে। টেবিল গেটওয়ে প্যাটার্নের মাধ্যমে আপনি ডাটাবেস অপারেশনগুলোকে অ্যাপ্লিকেশনের লজিক থেকে আলাদা রাখতে পারেন, যা রক্ষণাবেক্ষণ ও স্কেলেবিলিটি সহজ করে তোলে।


টেবিল গেটওয়ে প্যাটার্নের মূল ধারণা

টেবিল গেটওয়ে প্যাটার্নে একটি ক্লাস (গেটওয়ে) ডাটাবেস টেবিলের সব CRUD (Create, Read, Update, Delete) অপারেশন হ্যান্ডেল করে। এই গেটওয়ে ক্লাসটি সাধারণত ডাটাবেস টেবিলের একেকটি রেকর্ডের সাথে ইন্টারঅ্যাক্ট করে, এবং ডাটাবেসের কাজগুলো অ্যাপ্লিকেশনের অন্যান্য অংশ থেকে আলাদা রাখে।

গেটওয়ে ক্লাসটি সাধারণত একটি একক টেবিলের জন্য কাজ করে এবং ডাটাবেসের প্রতিটি রেকর্ডকে একটি Entity বা Model অবজেক্ট হিসেবে রিপ্রেজেন্ট করে। টেবিল গেটওয়ে প্যাটার্নটি মূলত ডাটাবেসের সাথে যোগাযোগকে সহজ এবং মডুলার করে তোলে।


টেবিল গেটওয়ে প্যাটার্নের ব্যবহার

Zend Framework বা Laminas এ টেবিল গেটওয়ে প্যাটার্ন ব্যবহারের জন্য সাধারণভাবে যে স্টেপগুলো অনুসরণ করতে হয় তা নিচে আলোচনা করা হলো:

  1. গেটওয়ে ক্লাস তৈরি: টেবিলের জন্য একটি গেটওয়ে ক্লাস তৈরি করা হয়, যা ডাটাবেস টেবিলের সাথে সমস্ত যোগাযোগের জন্য দায়ী হবে।
  2. মডেল বা এন্টিটি তৈরি: ডাটাবেস টেবিলের রেকর্ডের জন্য একটি মডেল বা এন্টিটি ক্লাস তৈরি করা হয়, যা টেবিলের কলামগুলিকে রিপ্রেজেন্ট করবে।
  3. গেটওয়ে ক্লাসের মাধ্যমে ডাটাবেস অপারেশন: 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 মডেলটি ডাটাবেস টেবিলের রেকর্ডগুলিকে রিপ্রেজেন্ট করে।

এই প্যাটার্নের মাধ্যমে অ্যাপ্লিকেশনটির ডাটাবেস সম্পর্কিত লজিক এবং অ্যাপ্লিকেশনের অন্যান্য অংশের লজিককে আলাদা রাখা সম্ভব হয়।

Content added By

Zend Framework (এখন Laminas) এ CRUD অপারেশনগুলি তৈরি (Create), পড়া (Read), আপডেট (Update) এবং মুছে ফেলা (Delete) মূলভাবে ডাটাবেস পরিচালনার সাথে সম্পর্কিত। CRUD অপারেশনগুলো একটি ওয়েব অ্যাপ্লিকেশনে ডাটার জীবনচক্র পরিচালনা করতে ব্যবহৃত হয়। এটি সাধারণত ডাটাবেসের সাথে যোগাযোগ করে, যেখানে ব্যবহারকারীর ইনপুট গ্রহণ এবং ডাটাবেসে সেই ডাটা ইনসার্ট, রিট্রিভ, আপডেট বা ডিলিট করা হয়।

এই গাইডে, Zend Framework এ CRUD অপারেশন কিভাবে বাস্তবায়ন করবেন তা বিস্তারিতভাবে দেখানো হবে।


১. Create (তৈরি করা)

Create অপারেশন ব্যবহার করে ডাটাবেসে নতুন রেকর্ড তৈরি করা হয়। সাধারণত এটি একটি ফর্ম থেকে ইনপুট নিয়ে ডাটাবেসে সেই তথ্য ইনসার্ট করে।

মডেল:

প্রথমে একটি Product মডেল তৈরি করা হবে যা ডাটাবেসের সাথে যোগাযোগ করবে।

namespace Product\Model;

use Laminas\Db\TableGateway\TableGateway;
use Laminas\Db\Adapter\AdapterInterface;

class ProductTable
{
    protected $tableGateway;

    public function __construct(TableGateway $tableGateway)
    {
        $this->tableGateway = $tableGateway;
    }

    public function addProduct($data)
    {
        $this->tableGateway->insert($data);
    }
}

কন্ট্রোলার:

কন্ট্রোলারটি ফর্ম থেকে ইনপুট নেয় এবং ProductTable মডেলটি ব্যবহার করে ডাটাবেসে ডাটা ইনসার্ট করে।

namespace Product\Controller;

use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
use Product\Model\ProductTable;

class ProductController extends AbstractActionController
{
    protected $productTable;

    public function __construct(ProductTable $productTable)
    {
        $this->productTable = $productTable;
    }

    public function addAction()
    {
        $request = $this->getRequest();
        if ($request->isPost()) {
            $data = [
                'name' => $request->getPost('name'),
                'price' => $request->getPost('price'),
            ];
            $this->productTable->addProduct($data);
            return $this->redirect()->toRoute('product');
        }

        return new ViewModel();
    }
}

ভিউ (Form):

এখন একটি ফর্ম তৈরি করতে হবে যেখানে ব্যবহারকারী পণ্য নাম এবং দাম প্রদান করবে।

<form method="post" action="/product/add">
    <label for="name">Product Name</label>
    <input type="text" name="name" required>
    <label for="price">Price</label>
    <input type="text" name="price" required>
    <button type="submit">Add Product</button>
</form>

২. Read (পড়া)

Read অপারেশন ডাটাবেস থেকে ডাটা রিটার্ন করে এবং ভিউতে সেই ডাটা প্রদর্শন করে। সাধারণত এটি একটি রিড-অনলি অপারেশন যেখানে ইউজারের দেখার জন্য ডাটা ফেচ করা হয়।

মডেল:

namespace Product\Model;

use Laminas\Db\TableGateway\TableGateway;
use Laminas\Db\Adapter\AdapterInterface;

class ProductTable
{
    protected $tableGateway;

    public function __construct(TableGateway $tableGateway)
    {
        $this->tableGateway = $tableGateway;
    }

    public function fetchAll()
    {
        return $this->tableGateway->select();
    }
}

কন্ট্রোলার:

namespace Product\Controller;

use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
use Product\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]);
    }
}

ভিউ (Display):

<h1>Product List</h1>
<ul>
    <?php foreach ($this->products as $product): ?>
        <li><?php echo $product->name . ' - $' . $product->price; ?></li>
    <?php endforeach; ?>
</ul>

৩. Update (আপডেট করা)

Update অপারেশন ডাটাবেসে বিদ্যমান রেকর্ড আপডেট করতে ব্যবহৃত হয়। এটি সাধারণত ইউজার থেকে ইনপুট নিয়ে পুরোনো ডাটা পরিবর্তন করে।

মডেল:

namespace Product\Model;

use Laminas\Db\TableGateway\TableGateway;
use Laminas\Db\Adapter\AdapterInterface;

class ProductTable
{
    protected $tableGateway;

    public function __construct(TableGateway $tableGateway)
    {
        $this->tableGateway = $tableGateway;
    }

    public function updateProduct($id, $data)
    {
        $this->tableGateway->update($data, ['id' => $id]);
    }
}

কন্ট্রোলার:

namespace Product\Controller;

use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
use Product\Model\ProductTable;

class ProductController extends AbstractActionController
{
    protected $productTable;

    public function __construct(ProductTable $productTable)
    {
        $this->productTable = $productTable;
    }

    public function editAction()
    {
        $id = (int) $this->params()->fromRoute('id', 0);
        if ($id == 0) {
            return $this->redirect()->toRoute('product');
        }

        $request = $this->getRequest();
        if ($request->isPost()) {
            $data = [
                'name' => $request->getPost('name'),
                'price' => $request->getPost('price'),
            ];
            $this->productTable->updateProduct($id, $data);
            return $this->redirect()->toRoute('product');
        }

        // এখানে ডাটাবেস থেকে পণ্যটির তথ্য এনে ফর্মে প্রি-পপুলেট করুন
        return new ViewModel(['id' => $id]);
    }
}

ভিউ (Edit Form):

<form method="post" action="/product/edit/<?php echo $id; ?>">
    <label for="name">Product Name</label>
    <input type="text" name="name" value="<?php echo $product->name; ?>" required>
    <label for="price">Price</label>
    <input type="text" name="price" value="<?php echo $product->price; ?>" required>
    <button type="submit">Update Product</button>
</form>

৪. Delete (মুছে ফেলা)

Delete অপারেশন ব্যবহার করে ডাটাবেস থেকে রেকর্ড মুছে ফেলা হয়। সাধারণত এটি ইউজারের অনুরোধের ভিত্তিতে ডাটা রিমুভ করে।

মডেল:

namespace Product\Model;

use Laminas\Db\TableGateway\TableGateway;
use Laminas\Db\Adapter\AdapterInterface;

class ProductTable
{
    protected $tableGateway;

    public function __construct(TableGateway $tableGateway)
    {
        $this->tableGateway = $tableGateway;
    }

    public function deleteProduct($id)
    {
        $this->tableGateway->delete(['id' => $id]);
    }
}

কন্ট্রোলার:

namespace Product\Controller;

use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
use Product\Model\ProductTable;

class ProductController extends AbstractActionController
{
    protected $productTable;

    public function __construct(ProductTable $productTable)
    {
        $this->productTable = $productTable;
    }

    public function deleteAction()
    {
        $id = (int) $this->params()->fromRoute('id', 0);
        if ($id == 0) {
            return $this->redirect()->toRoute('product');
        }

        $this->productTable->deleteProduct($id);
        return $this->redirect()->toRoute('product');
    }
}

সারাংশ

Zend Framework (Laminas) এ CRUD অপারেশনগুলি ডাটাবেসের সাথে কার্যকরভাবে কাজ করার জন্য ব্যবহৃত হয়। Create, Read, Update, এবং Delete অপারেশনগুলি অ্যাপ্লিকেশনটির প্রধান অংশ, যেখানে ইউজারের ইনপুটের ভিত্তিতে ডাটাবেসে পরিবর্তন করা হয়। এই অপারেশনগুলি যথাযথভাবে ইমপ্লিমেন্ট করার জন্য কন্ট্রোলার, মডেল এবং ভিউ ফাইলগুলির সমন্বয় প্রয়োজন।

Content added By

Zend Framework (এখন Laminas) একটি শক্তিশালী MVC ফ্রেমওয়ার্ক যা ডাটাবেস রিলেশনশিপ এবং অ্যাসোসিয়েশন হ্যান্ডল করার জন্য বিভিন্ন ফিচার প্রদান করে। ওয়েব অ্যাপ্লিকেশনের ডাটা মডেল গঠন করতে গিয়ে, আপনাকে প্রায়ই ডাটাবেস টেবিলগুলির মধ্যে সম্পর্ক স্থাপন করতে হয়, যেমন One-to-Many, Many-to-Many সম্পর্ক। Zend Framework এই সম্পর্কগুলোর সমর্থন দেয়, এবং ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করার জন্য এর Doctrine ORM (Object-Relational Mapping) অথবা Zend\Db এর মাধ্যমে সম্পর্কগুলি পরিচালনা করা হয়।

এখানে আমরা One-to-Many এবং Many-to-Many সম্পর্ক এবং অ্যাসোসিয়েশন কিভাবে কাজ করে তা বিস্তারিতভাবে আলোচনা করব।


One-to-Many সম্পর্ক (One-to-Many Relationship)

One-to-Many সম্পর্ক এমন একটি সম্পর্ক যেখানে একটি রেকর্ড অন্য টেবিলের একাধিক রেকর্ডের সাথে সম্পর্কিত থাকে। উদাহরণস্বরূপ, একটি Post (পোস্ট) এর সাথে একাধিক Comment (মন্তব্য) থাকতে পারে। একে সাধারণত ১ টা পোস্ট - অনেকগুলো মন্তব্য হিসেবে বুঝতে পারি।

উদাহরণ: Post এবং Comment সম্পর্ক

  1. Post Table: একটি টেবিল যেখানে প্রতিটি পোস্টের জন্য একটি post_id থাকবে।
  2. Comment Table: একটি টেবিল যেখানে প্রতিটি মন্তব্যের জন্য comment_id এবং post_id থাকবে (এখানে post_id ফিল্ডটি foreign key হিসেবে কাজ করবে, যা One-to-Many সম্পর্ক নির্ধারণ করবে)।
১. Post Entity Class
namespace Application\Model;

class Post
{
    protected $id;
    protected $title;
    protected $comments; // One-to-Many Relationship

    public function getComments()
    {
        return $this->comments;
    }

    public function setComments($comments)
    {
        $this->comments = $comments;
    }

    // Other getters and setters
}
২. Comment Entity Class
namespace Application\Model;

class Comment
{
    protected $id;
    protected $post_id; // Foreign key to Post
    protected $content;

    // Getters and setters
}
৩. Database Query

এখানে, ডাটাবেসের একটি SELECT স্টেটমেন্ট ব্যবহার করে Post এর সাথে সম্পর্কিত Comment গুলো রিট্রিভ করা হবে।

// Get all comments related to a particular post
$postId = 1; // Example post ID
$sql = "SELECT * FROM comments WHERE post_id = ?";
$comments = $dbAdapter->query($sql, [$postId]);

Many-to-Many সম্পর্ক (Many-to-Many Relationship)

Many-to-Many সম্পর্ক তখন ঘটে যখন একটি রেকর্ড অন্য টেবিলের একাধিক রেকর্ডের সাথে সম্পর্কিত থাকে এবং সেই টেবিলের রেকর্ডও প্রথম টেবিলের একাধিক রেকর্ডের সাথে সম্পর্কিত থাকে। উদাহরণস্বরূপ, একজন Student (স্টুডেন্ট) অনেক Course (কোর্স) এর সাথে যুক্ত থাকতে পারে, এবং একটি Course অনেক Student এর সাথে যুক্ত থাকতে পারে।

উদাহরণ: Student এবং Course সম্পর্ক

  1. Student Table: একটি টেবিল যেখানে প্রতিটি স্টুডেন্টের জন্য একটি student_id থাকবে।
  2. Course Table: একটি টেবিল যেখানে প্রতিটি কোর্সের জন্য course_id থাকবে।
  3. Student_Course Table: একটি সংযোগী টেবিল, যা Student এবং Course টেবিলের মধ্যে সম্পর্ক তৈরি করবে। এই টেবিলে student_id এবং course_id থাকবে।
১. Student Entity Class
namespace Application\Model;

class Student
{
    protected $id;
    protected $name;
    protected $courses = []; // Many-to-Many Relationship

    public function getCourses()
    {
        return $this->courses;
    }

    public function setCourses($courses)
    {
        $this->courses = $courses;
    }

    // Other getters and setters
}
২. Course Entity Class
namespace Application\Model;

class Course
{
    protected $id;
    protected $name;

    // Getters and setters
}
৩. Student_Course Table (Joining Table)

এই টেবিলটি Student এবং Course টেবিলের মধ্যে সম্পর্ক তৈরি করবে। এখানে student_id এবং course_id একটি foreign key হিসাবে কাজ করবে।

CREATE TABLE student_course (
    student_id INT NOT NULL,
    course_id INT NOT NULL,
    PRIMARY KEY (student_id, course_id),
    FOREIGN KEY (student_id) REFERENCES student(id),
    FOREIGN KEY (course_id) REFERENCES course(id)
);
৪. Database Query

এখানে Student এর সাথে সম্পর্কিত সমস্ত Course রিট্রিভ করার জন্য একটি JOIN স্টেটমেন্ট ব্যবহার করা হবে।

// Get all courses related to a particular student
$studentId = 1;
$sql = "
    SELECT c.* 
    FROM course c
    INNER JOIN student_course sc ON c.id = sc.course_id
    WHERE sc.student_id = ?
";
$courses = $dbAdapter->query($sql, [$studentId]);

Zend Framework বা Laminas এ Relationship হ্যান্ডলিং

Zend Framework বা Laminas এ Relationships হ্যান্ডল করার জন্য আপনি বিভিন্ন পদ্ধতি ব্যবহার করতে পারেন, যার মধ্যে সবচেয়ে সাধারণ দুটি পদ্ধতি হল Zend\Db এবং Doctrine ORM

  1. Zend\Db: এটি একটি লাইটওয়েট ডাটাবেস অ্যাবস্ট্রাকশন লেয়ার, যা ডাটাবেস অপারেশনগুলোর জন্য SQL কোড ব্যবহৃত হয় এবং রিলেশনশিপ গুলো প্রোগ্রাম্যাটিকভাবে ম্যানেজ করা হয়।
  2. Doctrine ORM: Doctrine একটি পূর্ণাঙ্গ ORM (Object-Relational Mapping) সিস্টেম যা সম্পর্কিত ডাটা মডেলগুলোকে ক্লাস ও অবজেক্টে ম্যাপিং করতে সাহায্য করে এবং রিলেশনশিপ ম্যানেজ করতে সাহায্য করে।

Doctrine ORM এ Relationship হ্যান্ডলিং

Doctrine ORM ব্যবহার করলে আপনি One-to-Many এবং Many-to-Many সম্পর্ক খুব সহজে সেটআপ করতে পারেন, কারণ এটি ডাটাবেস সম্পর্কগুলো ক্লাসের মধ্যে ম্যাপ করে দেয়। এখানে কিছু উদাহরণ দেওয়া হল:

One-to-Many (Post এবং Comments)

/**
 * @Entity
 * @Table(name="posts")
 */
class Post
{
    /** @Id @GeneratedValue @Column(type="integer") */
    private $id;

    /** @Column(type="string") */
    private $title;

    /**
     * @OneToMany(targetEntity="Comment", mappedBy="post")
     */
    private $comments;

    // Getters and setters
}

/**
 * @Entity
 * @Table(name="comments")
 */
class Comment
{
    /** @Id @GeneratedValue @Column(type="integer") */
    private $id;

    /** @Column(type="text") */
    private $content;

    /** @ManyToOne(targetEntity="Post", inversedBy="comments") */
    private $post;

    // Getters and setters
}

Many-to-Many (Student এবং Course)

/**
 * @Entity
 * @Table(name="students")
 */
class Student
{
    /** @Id @GeneratedValue @Column(type="integer") */
    private $id;

    /** @Column(type="string") */
    private $name;

    /**
     * @ManyToMany(targetEntity="Course", inversedBy="students")
     * @JoinTable(name="student_course",
     *      joinColumns={@JoinColumn(name="student_id", referencedColumnName="id")},
     *      inverseJoinColumns={@JoinColumn(name="course_id", referencedColumnName="id")}
     * )
     */
    private $courses;

    // Getters and setters
}

/**
 * @Entity
 * @Table(name="courses")
 */
class Course
{
    /** @Id @GeneratedValue @Column(type="integer") */
    private $id;

    /** @Column(type="string") */
    private $name;

    /**
     * @ManyToMany(targetEntity="Student", mappedBy="courses")
     */
    private $students;

    // Getters and setters
}

Doctrine ORM স্বয়ংক্রিয়ভাবে উপরের রিলেশনশিপগুলো ম্যানেজ করবে, এবং আপনি যখন $student->getCourses() অথবা $course->getStudents() কল করবেন, তখন এটি সম্পর্কিত ডাটা রিটার্ন করবে।


সারাংশ

Zend Framework বা Laminas এ One-to-Many এবং Many-to-Many সম্পর্ক এবং অ্যাসোসিয়েশন হ্যান্ডল করা একটি গুরুত্বপূর্ণ এবং প্রাথমিক কাজ। আপনি Zend\Db অথবা Doctrine ORM ব্যবহার করে এই সম্পর্কগুলির মধ্যে ডাটা অ্যাক্সেস এবং ম্যানিপুলেশন করতে পারেন। One-to-Many সম্পর্ক যেমন একটি পোস্টের সাথে অনেক মন্তব্য থাকতে পারে, তেমনি Many-to-Many সম্পর্ক যেমন অনেক স্টুডেন্ট বিভিন্ন কোর্সে

থাকতে পারে, সেগুলি সঠিকভাবে ম্যানেজ করা আপনার অ্যাপ্লিকেশনের কার্যকারিতা ও ডাটা ইন্টেগ্রিটি বজায় রাখে।

Content added By
Promotion

Are you sure to start over?

Loading...