Zend Framework বা Laminas এ Controllers এবং Actions অ্যাপ্লিকেশনের অত্যন্ত গুরুত্বপূর্ণ অংশ। তারা অ্যাপ্লিকেশনের ইউজারের রিকোয়েস্ট গ্রহণ এবং সেই রিকোয়েস্টের ভিত্তিতে সঠিক লজিক বা ডাটা প্রদর্শন করার দায়িত্ব পালন করে। এই প্রক্রিয়া MVC (Model-View-Controller) আর্কিটেকচারের একটি প্রধান উপাদান।
Controllers
Controller হল অ্যাপ্লিকেশনের একটি গুরুত্বপূর্ণ অংশ যা ইউজারের রিকোয়েস্ট অনুযায়ী প্রয়োজনীয় লজিক বা ডাটা প্রসেস করে এবং সেই ডাটা ভিউতে পাঠায়। কন্ট্রোলার মূলত আন্তঃক্রিয়া (interaction) এবং ব্যবসা-লজিক (business logic) পরিচালনা করে।
Zend Framework বা Laminas এ কন্ট্রোলার ক্লাসটি সাধারণত AbstractActionController ক্লাস থেকে ইনহেরিট করা হয়। এই কন্ট্রোলার একাধিক action ধারণ করতে পারে, যা ইউজারের রিকোয়েস্ট অনুযায়ী বিভিন্ন কাজ সম্পাদন করে।
Controllers এর কাজ
- রিকোয়েস্ট গ্রহণ: কন্ট্রোলার ইউজারের রিকোয়েস্ট (যেমন HTTP GET, POST) গ্রহণ করে।
- ডাটা প্রসেসিং: ইউজারের ইনপুট বা রিকোয়েস্ট অনুযায়ী ডাটা প্রক্রিয়াকরণ।
- মডেল কল করা: প্রক্রিয়াকৃত ডাটা মডেল থেকে সংগ্রহ করে প্রয়োজনীয় তথ্য প্রস্তুত করা।
- ভিউ রেন্ডারিং: ডাটা ভিউতে পাঠানো এবং ইউজারের সামনে সঠিক তথ্য বা পৃষ্ঠা উপস্থাপন করা।
Action
Action হল কন্ট্রোলারের একটি মেথড যা ইউজারের রিকোয়েস্ট অনুযায়ী কার্য সম্পাদন করে। প্রতিটি অ্যাকশন একটি নির্দিষ্ট URL রাউট বা রিকোয়েস্টের জন্য যুক্ত থাকে এবং রিকোয়েস্ট প্রসেসিংয়ের মাধ্যমে ভিউতে ডাটা পাঠানোর কাজ করে।
Zend Framework এ কন্ট্রোলারের প্রতিটি action মূলত একটি ফাংশন, যা সাধারণত Action শব্দের সাথে শেষ হয় (যেমন indexAction, viewAction ইত্যাদি)।
Controller এবং Action তৈরি করার প্রক্রিয়া
এখন কিভাবে Zend Framework বা Laminas এ কন্ট্রোলার এবং অ্যাকশন তৈরি করতে হয়, তার বিস্তারিত পদক্ষেপ দেখে নেওয়া যাক।
১. কন্ট্রোলার তৈরি
প্রথমে একটি কন্ট্রোলার তৈরি করতে হবে, যা AbstractActionController ক্লাস থেকে ইনহেরিট করবে।
কন্ট্রোলার ফোল্ডার এবং ক্লাস:
module/Application/src/Controller/IndexController.php
IndexController.php:
<?php
namespace Application\Controller;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
class IndexController extends AbstractActionController
{
public function indexAction()
{
return new ViewModel([
'message' => 'Welcome to the Home Page!'
]);
}
public function aboutAction()
{
return new ViewModel([
'message' => 'This is the About Page.'
]);
}
}
এখানে IndexController নামে একটি কন্ট্রোলার তৈরি করা হয়েছে, যার দুটি অ্যাকশন রয়েছে:
indexAction(): মূল পেজ বা হোম পেজের জন্য।aboutAction(): একটি অ্যাকশন যা "About" পেজের ডাটা রেন্ডার করবে।
২. রাউটিং কনফিগারেশন
কন্ট্রোলারের অ্যাকশনগুলো রাউট করার জন্য কনফিগারেশন ফাইল তৈরি করতে হবে, যাতে ইউজারের রিকোয়েস্ট সঠিক অ্যাকশনে রিডাইরেক্ট হয়।
module.config.php:
<?php
namespace Application;
return [
'controllers' => [
'invokables' => [
'Application\Controller\Index' => 'Application\Controller\IndexController',
],
],
'router' => [
'routes' => [
'home' => [
'type' => 'Literal',
'options' => [
'route' => '/',
'defaults' => [
'controller' => 'Application\Controller\Index',
'action' => 'index',
],
],
],
'about' => [
'type' => 'Literal',
'options' => [
'route' => '/about',
'defaults' => [
'controller' => 'Application\Controller\Index',
'action' => 'about',
],
],
],
],
],
'view_manager' => [
'template_path_stack' => [
'application' => __DIR__ . '/../view',
],
],
];
এখানে আমরা দুটি রাউট কনফিগার করেছি:
/রাউট যাindexAction()অ্যাকশনে রিডাইরেক্ট হবে।/aboutরাউট যাaboutAction()অ্যাকশনে রিডাইরেক্ট হবে।
৩. ভিউ তৈরি
এখন কন্ট্রোলারের অ্যাকশনগুলোর জন্য ভিউ তৈরি করতে হবে, যেখানে ডাটা রেন্ডার হবে।
ফোল্ডার স্ট্রাকচার:
module/Application/view/application/index/index.phtml
module/Application/view/application/index/about.phtml
index.phtml (হোম পেজ):
<h1><?php echo $this->escapeHtml($message); ?></h1>
about.phtml (অ্যাবাউট পেজ):
<h1><?php echo $this->escapeHtml($message); ?></h1>
এখানে, index.phtml এবং about.phtml ভিউ ফাইলে $message ভেরিয়েবল রেন্ডার হচ্ছে, যা কন্ট্রোলারের অ্যাকশন থেকে পাঠানো হয়েছে।
কন্ট্রোলার এবং অ্যাকশনের কাজের ধারা
- ইউজার রিকোয়েস্ট: ইউজার যদি
/রিকোয়েস্ট পাঠায়, তাহলে/homeরাউটটিindexActionঅ্যাকশনে রিডাইরেক্ট হবে। - Controller: কন্ট্রোলার
indexActionবাaboutActionকল করবে, ইউজারের জন্য প্রয়োজনীয় ডাটা প্রস্তুত করবে। - Model: কন্ট্রোলারের মাধ্যমে প্রয়োজনীয় ডাটা মডেল থেকে সংগ্রহ বা প্রসেস করা হবে (যদি প্রয়োজন হয়)।
- View: কন্ট্রোলার থেকে প্রাপ্ত ডাটা ভিউতে পাঠানো হবে, যেখানে সেটি রেন্ডার হবে।
সারাংশ
Zend Framework বা Laminas এ Controllers এবং Actions হল অ্যাপ্লিকেশনের ইউজারের রিকোয়েস্ট গ্রহণ এবং প্রক্রিয়া করার মূল উপাদান। কন্ট্রোলার বিভিন্ন অ্যাকশন ধারণ করতে পারে, যা ইউজারের রিকোয়েস্ট অনুযায়ী কাজ করে। কন্ট্রোলার ক্লাস AbstractActionController থেকে ইনহেরিট করে তৈরি হয়, এবং অ্যাকশন মেথডগুলি মূলত রিকোয়েস্ট হ্যান্ডলিংয়ের দায়িত্ব পালন করে। এই অ্যাকশনগুলোর মাধ্যমে ডাটা প্রক্রিয়া করা হয় এবং ভিউতে পাঠানো হয়, যা শেষে ইউজার ইন্টারফেসে প্রদর্শিত হয়।
Zend Framework (এখন Laminas) এ একটি Controller ক্লাস তৈরি করা এবং এর কনফিগারেশন সঠিকভাবে করা অ্যাপ্লিকেশনের কার্যকরী অংশ গঠন করতে অত্যন্ত গুরুত্বপূর্ণ। কন্ট্রোলার হলো অ্যাপ্লিকেশনটির লজিক্যাল সেন্টার, যেখানে ইউজারের রিকোয়েস্ট গ্রহণ করা হয়, প্রয়োজনীয় ডাটা প্রসেস করা হয় এবং সেই ডাটা ভিউতে পাঠানো হয়।
এখানে আমরা শিখব কিভাবে একটি নতুন Controller ক্লাস তৈরি করতে হয় এবং তার সাথে সংশ্লিষ্ট কনফিগারেশন সেট করতে হয়।
১. Controller ক্লাস তৈরি করা
Zend Framework এ কন্ট্রোলার ক্লাস তৈরি করতে, প্রথমে আপনাকে একটি ক্লাস তৈরি করতে হবে যা AbstractActionController থেকে ইনহেরিট করবে। এই ক্লাসে আপনি বিভিন্ন অ্যাকশন মেথড তৈরি করতে পারবেন, যেমন indexAction বা viewAction।
কন্ট্রোলার ক্লাসের স্ট্রাকচার
ধরা যাক, আমরা একটি ProductController ক্লাস তৈরি করতে যাচ্ছি, যা পণ্যের তথ্য দেখাবে।
ফোল্ডার স্ট্রাকচার:
module/Product/src/Controller/ProductController.php
ProductController.php:
<?php
namespace Product\Controller;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
class ProductController extends AbstractActionController
{
public function indexAction()
{
// এখানে কোনো ডাটা প্রসেস করা হতে পারে
$message = 'Welcome to the Product Page!';
// ভিউতে ডাটা পাঠানো
return new ViewModel([
'message' => $message
]);
}
public function viewAction()
{
// একটি নির্দিষ্ট পণ্যের বিস্তারিত তথ্য দেখানোর জন্য
$productId = $this->params()->fromRoute('id', 0);
// ডাটা সংগ্রহ (এই উদাহরণে শুধুমাত্র একটি dummy ডাটা)
$product = [
'id' => $productId,
'name' => 'Product ' . $productId,
'price' => 100 + $productId
];
// ভিউ মডেল তৈরির মাধ্যমে ডাটা পাঠানো
return new ViewModel([
'product' => $product
]);
}
}
এই কন্ট্রোলারে দুটি অ্যাকশন রয়েছে:
indexAction(): সাধারণভাবে পণ্য পৃষ্ঠা বা হোম পেজে গিয়ে দেখাবে।viewAction(): একটি নির্দিষ্ট পণ্যের বিস্তারিত দেখানোর জন্য ডাটা সংগ্রহ করে।
২. কন্ট্রোলার কনফিগারেশন
কন্ট্রোলার তৈরি করার পর, তাকে অ্যাপ্লিকেশনের রাউটিং কনফিগারেশনে অন্তর্ভুক্ত করা দরকার। এর জন্য module.config.php ফাইলে কন্ট্রোলারটি রেজিস্টার করতে হবে এবং তার সাথে রাউটিং কনফিগারেশন নির্ধারণ করতে হবে।
কনফিগারেশন ফাইল
ফোল্ডার স্ট্রাকচার:
module/Product/config/module.config.php
module.config.php:
<?php
namespace Product;
return [
'controllers' => [
'invokables' => [
'Product\Controller\Product' => 'Product\Controller\ProductController',
],
],
'router' => [
'routes' => [
'product' => [
'type' => 'Literal',
'options' => [
'route' => '/product',
'defaults' => [
'controller' => 'Product\Controller\Product',
'action' => 'index',
],
],
],
'product-view' => [
'type' => 'segment',
'options' => [
'route' => '/product/view/:id',
'defaults' => [
'controller' => 'Product\Controller\Product',
'action' => 'view',
],
],
],
],
],
'view_manager' => [
'template_path_stack' => [
'product' => __DIR__ . '/../view',
],
],
];
এখানে আমরা দুটি রাউট তৈরি করেছি:
product:/productরাউটটিProductControllerএরindexActionকে কল করবে।product-view:/product/view/:idরাউটটিProductControllerএরviewActionকে কল করবে, যেখানে:idহলো পণ্যের আইডি।
এছাড়া, view_manager সেকশনে template_path_stack দিয়ে ভিউ ফাইলের লোকেশন নির্ধারণ করা হয়েছে, যাতে সঠিক ভিউটি রেন্ডার করা যায়।
৩. ভিউ ফাইল তৈরি
এখন কন্ট্রোলার থেকে যে ডাটা ভিউতে পাঠানো হচ্ছে, সেটি রেন্ডার করার জন্য একটি ভিউ ফাইল তৈরি করতে হবে। ভিউ ফাইলগুলো সাধারণত .phtml এক্সটেনশনে থাকে।
ভিউ ফাইল
ফোল্ডার স্ট্রাকচার:
module/Product/view/product/product/index.phtml
module/Product/view/product/product/view.phtml
index.phtml:
<h1><?php echo $this->escapeHtml($message); ?></h1>
এই ভিউ ফাইলে $message ভেরিয়েবলটি কন্ট্রোলার থেকে পাঠানো হচ্ছে, যা এখানে "Welcome to the Product Page!" বার্তা হিসেবে প্রদর্শিত হবে।
view.phtml:
<h1>Product Details</h1>
<ul>
<li>ID: <?php echo $this->escapeHtml($this->product['id']); ?></li>
<li>Name: <?php echo $this->escapeHtml($this->product['name']); ?></li>
<li>Price: $<?php echo $this->escapeHtml($this->product['price']); ?></li>
</ul>
এটি viewAction থেকে প্রাপ্ত পণ্য সম্পর্কিত তথ্য রেন্ডার করবে, যেমন পণ্যের আইডি, নাম এবং দাম।
৪. অ্যাপ্লিকেশন কনফিগারেশন
এখন, আমরা আমাদের তৈরি করা মডিউলটি অ্যাপ্লিকেশনের application.config.php ফাইলে রেজিস্টার করব। এই ফাইলটি অ্যাপ্লিকেশনের মূল কনফিগারেশন ফাইল হিসেবে কাজ করে।
ফোল্ডার স্ট্রাকচার:
config/application.config.php
application.config.php:
return [
'modules' => [
'Application', // প্রধান অ্যাপ্লিকেশন মডিউল
'Product', // আমাদের তৈরি করা নতুন মডিউল
],
'module_listener_options' => [
'config_glob_paths' => [
'config/autoload/{,*.}{global,local}.php',
],
],
];
এখানে Product মডিউলটি সক্রিয় করা হয়েছে।
৫. অ্যাপ্লিকেশন চালানো
এখন, আপনার অ্যাপ্লিকেশন চালু করতে হবে এবং কনফিগার করা রাউটের সাথে মেলে এমন URL-এ গিয়ে ব্রাউজারে রেন্ডার করা ডাটা দেখতে হবে।
/product-ProductControllerএরindexActionরেন্ডার হবে।/product/view/1-ProductControllerএরviewActionরেন্ডার হবে এবং পণ্যের বিস্তারিত তথ্য প্রদর্শিত হবে।
সারাংশ
Zend Framework বা Laminas এ কন্ট্রোলার ক্লাস তৈরি এবং কনফিগারেশন একটি স্টেপ-বাই-স্টেপ প্রক্রিয়া। প্রথমে একটি কন্ট্রোলার ক্লাস তৈরি করতে হয়, যা AbstractActionController থেকে ইনহেরিট হয়। তারপর, কন্ট্রোলারটির জন্য রাউটিং কনফিগারেশন করতে হয় এবং নির্দিষ্ট অ্যাকশনগুলোকে মডিউল কনফিগারেশন ফাইলে যুক্ত করতে হয়। শেষে, ভিউ ফাইল তৈরি করে কন্ট্রোলার থেকে পাঠানো ডাটা রেন্ডার করতে হয়।
Zend Framework (এখন Laminas) এ কন্ট্রোলার হল সেই জায়গা যেখানে অ্যাপ্লিকেশনের লজিক প্রসেস করা হয় এবং ইউজারের রিকোয়েস্টের ভিত্তিতে বিভিন্ন অ্যাকশন মেথড চালিত হয়। কন্ট্রোলারে প্রতিটি অ্যাকশন মেথড হল একটি নির্দিষ্ট রিকোয়েস্ট হ্যান্ডলিং ফাংশন, যা ইউজারের রিকোয়েস্ট অনুযায়ী কাজ করে। প্রতিটি অ্যাকশন মেথড একটি নির্দিষ্ট রাউট বা URL পাথের সাথে সংযুক্ত থাকে এবং তা রিকোয়েস্ট প্রাপ্ত হলে কার্যকরী হয়।
একটি কন্ট্রোলারে একাধিক অ্যাকশন মেথড থাকতে পারে, যেমন indexAction, createAction, updateAction, deleteAction ইত্যাদি। এই অ্যাকশন মেথডগুলির মূল কাজ হলো ইউজারের রিকোয়েস্ট অনুযায়ী ডাটা প্রসেস করা এবং সেই ডাটা ভিউতে পাঠানো।
Action মেথডের ভূমিকা
- রিকোয়েস্ট হ্যান্ডলিং: প্রতিটি অ্যাকশন মেথড ইউজারের নির্দিষ্ট রিকোয়েস্ট গ্রহণ করে। কন্ট্রোলার মেথড ইউজারের ইন্টারঅ্যাকশন অনুযায়ী কাজ করে—যেমন ডাটা দেখানো, ডাটা তৈরি বা ডাটা আপডেট করা।
- ডাটা প্রসেসিং: অ্যাকশন মেথডে ডাটা সংগ্রহ, প্রক্রিয়া, এবং তা মডেল বা ডাটাবেস থেকে ফেচ করা হয়। এর মাধ্যমে অ্যাপ্লিকেশনের লজিক কার্যকর করা হয়।
- ভিউতে ডাটা পাঠানো: অ্যাকশন মেথড একটি ViewModel অবজেক্ট রিটার্ন করে, যাতে ডাটা ভিউতে পাঠানো হয়। এটি ইউজারের ইন্টারফেসে ডাটা প্রদর্শন করতে ব্যবহৃত হয়।
- রাউটিং ও অ্যাকশন মডুলারিটি: কন্ট্রোলারের প্রতিটি অ্যাকশন একটি নির্দিষ্ট রাউট বা URL পাথের সাথে মেলে। অ্যাকশন মেথডগুলো মডুলার কোড রচনায় সহায়তা করে, যাতে একাধিক ফিচারকে আলাদা করা যায়।
Zend Framework এ Action মেথডের উদাহরণ
Zend Framework বা Laminas এ কন্ট্রোলার কিভাবে কাজ করে এবং অ্যাকশন মেথড কিভাবে রাউটেড হয় তার একটি উদাহরণ দেওয়া হলো।
কন্ট্রোলার তৈরি করা
ধরা যাক, আমরা একটি ProductController তৈরি করতে চাই এবং এর মধ্যে কিছু সাধারণ অ্যাকশন মেথড যুক্ত করব।
ফোল্ডার স্ট্রাকচার:
module/Product/src/Controller/ProductController.php
ProductController.php:
<?php
namespace Product\Controller;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
class ProductController extends AbstractActionController
{
public function indexAction()
{
// এখানে ডাটা প্রসেস করা হচ্ছে (যেমন মডেল থেকে পণ্য ডাটা নেওয়া)
$message = "Welcome to the Product Page!";
// ভিউতে পাঠানোর জন্য ডাটা রিটার্ন
return new ViewModel([
'message' => $message
]);
}
public function addAction()
{
// নতুন পণ্য যোগ করার জন্য ফর্ম প্রদর্শন বা ডাটা প্রসেস
$message = "Add a new product here!";
// ভিউতে পাঠানোর জন্য ডাটা রিটার্ন
return new ViewModel([
'message' => $message
]);
}
public function editAction()
{
// একটি নির্দিষ্ট পণ্য আপডেট করার জন্য ডাটা প্রসেস
$id = $this->params()->fromRoute('id');
$message = "Edit the product with ID: $id";
// ভিউতে পাঠানোর জন্য ডাটা রিটার্ন
return new ViewModel([
'message' => $message,
'id' => $id
]);
}
public function deleteAction()
{
// পণ্য মুছে ফেলার জন্য লজিক
$id = $this->params()->fromRoute('id');
$message = "Product with ID $id deleted.";
// ভিউতে পাঠানোর জন্য ডাটা রিটার্ন
return new ViewModel([
'message' => $message,
'id' => $id
]);
}
}
এখানে আমরা চারটি অ্যাকশন মেথড তৈরি করেছি:
- indexAction: প্রধান পৃষ্ঠার জন্য, যেখানে "Welcome to the Product Page!" মেসেজ প্রদর্শন করা হচ্ছে।
- addAction: নতুন পণ্য যোগ করার জন্য, যেখানে একটি ফর্ম বা ইনপুট অপশন দেখানো হবে।
- editAction: একটি নির্দিষ্ট পণ্য আপডেট করার জন্য, যেখানে
idপ্যারামিটারটি রিকোয়েস্ট থেকে নেওয়া হচ্ছে। - deleteAction: একটি নির্দিষ্ট পণ্য মুছে ফেলার জন্য, যেখানে
idপ্যারামিটার দিয়ে পণ্য মুছে ফেলা হয়।
Action মেথডের মাধ্যমে ডাটা ভিউতে পাঠানো
Zend Framework এ, প্রতিটি অ্যাকশন মেথড ViewModel অবজেক্ট রিটার্ন করে, যা ভিউতে ডাটা পাঠানোর জন্য ব্যবহৃত হয়।
উদাহরণস্বরূপ, indexAction মেথডে আমরা একটি $message ডাটা তৈরি করেছি এবং তা ViewModel এর মাধ্যমে ভিউতে পাঠিয়েছি:
return new ViewModel([
'message' => $message
]);
এখন, এই ডাটা আমাদের ভিউ ফাইলে ব্যবহার করা যাবে।
রাউটিং কনফিগারেশন
এখন, এই কন্ট্রোলার এবং অ্যাকশনগুলিকে অ্যাপ্লিকেশনে রাউট করতে হবে। এটি module.config.php ফাইলে কনফিগার করা হয়।
ফোল্ডার স্ট্রাকচার:
module/Product/config/module.config.php
module.config.php:
<?php
namespace Product;
return [
'controllers' => [
'invokables' => [
'Product\Controller\Product' => 'Product\Controller\ProductController',
],
],
'router' => [
'routes' => [
'product' => [
'type' => 'Literal',
'options' => [
'route' => '/product',
'defaults' => [
'controller' => 'Product\Controller\Product',
'action' => 'index',
],
],
],
'add-product' => [
'type' => 'Literal',
'options' => [
'route' => '/product/add',
'defaults' => [
'controller' => 'Product\Controller\Product',
'action' => 'add',
],
],
],
'edit-product' => [
'type' => 'Segment',
'options' => [
'route' => '/product/edit/:id',
'defaults' => [
'controller' => 'Product\Controller\Product',
'action' => 'edit',
],
'constraints' => [
'id' => '[0-9]+', // id শুধুমাত্র সংখ্যার হতে হবে
],
],
],
'delete-product' => [
'type' => 'Segment',
'options' => [
'route' => '/product/delete/:id',
'defaults' => [
'controller' => 'Product\Controller\Product',
'action' => 'delete',
],
'constraints' => [
'id' => '[0-9]+',
],
],
],
],
],
];
এখানে /product, /product/add, /product/edit/:id, এবং /product/delete/:id এর জন্য রাউটিং কনফিগার করা হয়েছে। প্রতিটি রাউট একটি নির্দিষ্ট কন্ট্রোলারের অ্যাকশন মেথডের সাথে সম্পর্কিত।
Action মেথডের ভূমিকা সারাংশ
Zend Framework বা Laminas এ Action মেথড হল কন্ট্রোলারের গুরুত্বপূর্ণ অংশ, যা ইউজারের রিকোয়েস্ট অনুযায়ী কার্যক্রম সম্পাদন করে এবং ডাটা ভিউতে রিটার্ন করে। প্রতিটি অ্যাকশন মেথড একটি নির্দিষ্ট রাউট বা URL পাথের সাথে সংযুক্ত থাকে এবং তা ডাটা প্রসেসিং, রাউটিং, এবং ভিউয়ে ডাটা পাঠানোর কাজ করে। এটি অ্যাপ্লিকেশনকে মডুলার, স্কেলেবল এবং রক্ষণাবেক্ষণযোগ্য করে তোলে।
Zend Framework (এখন Laminas) এ Redirect এবং Forwarding দুটি গুরুত্বপূর্ণ কনসেপ্ট যা ওয়েব অ্যাপ্লিকেশনের রিকোয়েস্ট পরিচালনা এবং রাউটিংয়ের ক্ষেত্রে ব্যবহৃত হয়। এগুলি মূলত ইউজারের রিকোয়েস্টকে একটি নতুন ইউআরএল বা অ্যাকশনে গাইড করার জন্য ব্যবহৃত হয়।
- Redirect: ইউজারকে একটি নতুন URL এ রিডাইরেক্ট করা।
- Forwarding: ইউজারের রিকোয়েস্ট অন্য একটি অ্যাকশনে বা কন্ট্রোলারে পাঠানো।
Zend Framework এ এগুলির ব্যবহারের মাধ্যমে আপনার অ্যাপ্লিকেশনের নেভিগেশন আরো দক্ষ এবং প্রফেশনাল হতে পারে।
Redirect (রিডাইরেক্ট)
Redirect হল ইউজারকে একটি নতুন URL এ পাঠানো। সাধারণত রিডাইরেক্ট ব্যবহার করা হয় যখন আপনি চান যে ইউজার এক অ্যাকশন থেকে অন্য অ্যাকশনে অথবা এক পৃষ্ঠার থেকে অন্য পৃষ্ঠায় চলে যাক।
রিডাইরেক্টের ধরন:
- HTTP 301 Redirect: এটি স্থায়ী রিডাইরেক্ট, যেটি সার্চ ইঞ্জিনগুলিতে প্রভাব ফেলে এবং পুরানো URL থেকে নতুন URL এ ট্রাফিক সরিয়ে নেয়।
- HTTP 302 Redirect: এটি অস্থায়ী রিডাইরেক্ট, যেটি সাধারণত সাময়িক রাউট পরিবর্তনের জন্য ব্যবহার করা হয়।
Zend Framework এ রিডাইরেক্ট করতে redirect() মেথড ব্যবহার করা হয়। এই মেথডটি কন্ট্রোলারের অ্যাকশন থেকে অন্য রাউটে রিডাইরেক্ট করতে ব্যবহৃত হয়।
উদাহরণ: রিডাইরেক্ট করা
namespace Application\Controller;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
class IndexController extends AbstractActionController
{
public function indexAction()
{
// এখানে ইউজারকে অন্য রাউটে রিডাইরেক্ট করা হচ্ছে
return $this->redirect()->toRoute('another-route');
}
}
এখানে toRoute('another-route') মেথডটি ইউজারকে another-route নামে ডিফাইন করা রাউটে রিডাইরেক্ট করবে। আপনি ইউআরএল বা প্যারামিটারও পাস করতে পারেন।
রিডাইরেক্টে প্যারামিটার পাঠানো
return $this->redirect()->toRoute('product/view', ['id' => 123]);
এখানে product/view রাউটে ইউজারকে রিডাইরেক্ট করা হচ্ছে এবং id প্যারামিটার হিসেবে 123 পাঠানো হচ্ছে।
Forwarding (ফরওয়ার্ডিং)
Forwarding হল ইউজারকে নতুন URL এ রিডাইরেক্ট না করে, সিস্টেমের মধ্যে রিকোয়েস্টকে একটি ভিন্ন অ্যাকশনে পাঠানো। ফরওয়ার্ডিংয়ের মাধ্যমে, রিকোয়েস্টটি প্রোগ্রাম্যাটিকালি অন্য একটি অ্যাকশন বা কন্ট্রোলারে পাঠানো হয়, কিন্তু ব্রাউজার URL পরিবর্তিত হয় না।
ফরওয়ার্ডিং ব্যবহারের মাধ্যমে, ইউজারের জন্য নতুন পৃষ্ঠায় রিডাইরেক্ট করার পরিবর্তে একই URL এ অন্য একটি অ্যাকশনে রিকোয়েস্ট পাঠানো হয়।
উদাহরণ: ফরওয়ার্ডিং করা
namespace Application\Controller;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
class IndexController extends AbstractActionController
{
public function indexAction()
{
// এখানে ইউজারের রিকোয়েস্টকে অন্য একটি অ্যাকশনে ফরওয়ার্ড করা হচ্ছে
return $this->forward()->dispatch('Application\Controller\Another', ['action' => 'anotherAction']);
}
}
এখানে forward()->dispatch() মেথডটি ইউজারের রিকোয়েস্টকে Application\Controller\Another কন্ট্রোলারের anotherAction অ্যাকশনে ফরওয়ার্ড করবে। এতে URL ঠিক থাকবে কিন্তু রিকোয়েস্টটি অন্য অ্যাকশনে পরিচালিত হবে।
Redirect এবং Forwarding এর পার্থক্য
| বৈশিষ্ট্য | Redirect | Forwarding |
|---|---|---|
| URL পরিবর্তন | হ্যাঁ, ব্রাউজারে নতুন URL দেখানো হয়। | না, ব্রাউজারে URL পরিবর্তিত হয় না। |
| ব্যবহার | ইউজারকে নতুন পৃষ্ঠায় নিয়ে যাওয়ার জন্য। | ইউজারের রিকোয়েস্টকে অন্য অ্যাকশনে পাঠানোর জন্য। |
| HTTP Status Code | 301 বা 302 HTTP Status Code ফেরত দেয়। | সাধারণত 200 HTTP Status Code ব্যবহৃত হয়। |
| পারফরম্যান্স | রিডাইরেক্টের জন্য ইউজারের ব্রাউজারকে নতুন রিকোয়েস্ট পাঠাতে হয়, যার ফলে এটি ফরওয়ার্ডিংয়ের চেয়ে ধীর হতে পারে। | ফরওয়ার্ডিং দ্রুত, কারণ এটি কেবল রিকোয়েস্ট প্রসেস করে। |
| রাউটিং | ইউজারের ব্রাউজার নতুন URL এ চলে যায়। | ইউজার একই URL এর মধ্যে থাকে, কিন্তু রিকোয়েস্ট অ্যাকশনে যায়। |
রিডাইরেক্ট এবং ফরওয়ার্ডিং এর ব্যবহার ক্ষেত্র
- Redirect ব্যবহার করা হয় যখন আপনি ইউজারকে নতুন পৃষ্ঠায় পাঠাতে চান, বা অ্যাপ্লিকেশন থেকে বাইরে অন্য কোনো URL বা পৃষ্ঠায় রিডাইরেক্ট করতে চান। যেমন, লগইন করার পর ইউজারকে হোমপেজে পাঠানো।
- Forwarding ব্যবহার করা হয় যখন আপনি ইউজারকে একই URL তে রেখে অন্য অ্যাকশনে বা কন্ট্রোলারে রিকোয়েস্ট পাঠাতে চান। যেমন, প্রিভিউ পেজ থেকে সেভ বা সাবমিট অ্যাকশনে ফরওয়ার্ড করা।
সারাংশ
Zend Framework বা Laminas এ Redirect এবং Forwarding দুটি গুরুত্বপূর্ণ ফিচার যা রিকোয়েস্ট পরিচালনা এবং ইউজারের নেভিগেশনকে সহজ করে তোলে। Redirect ইউজারকে নতুন URL এ রিডাইরেক্ট করে, যেখানে Forwarding একই URL তে ইউজারের রিকোয়েস্ট অন্য অ্যাকশনে পাঠিয়ে দেয়। দুইটি ফিচারই ওয়েব অ্যাপ্লিকেশন ডেভেলপমেন্টে প্রয়োজনীয়, এবং যথার্থভাবে ব্যবহৃত হলে অ্যাপ্লিকেশনকে আরো ইউজার-ফ্রেন্ডলি ও স্কেলেবল করে তোলে।
Zend Framework (এখন Laminas) কন্ট্রোলার প্লাগইন এবং হুকস (Hooks) ব্যবহার করে অ্যাপ্লিকেশন ডেভেলপমেন্টের ক্ষমতা বিস্তৃত করে। কন্ট্রোলার প্লাগইন এবং হুকস অ্যাপ্লিকেশনের বিভিন্ন প্রক্রিয়াতে কাস্টম কার্যক্রম সম্পাদন করতে সাহায্য করে, যেমন রিকোয়েস্ট প্রক্রিয়াকরণ, রেসপন্স ম্যানিপুলেশন, বা রাউটিং ফেজে ইন্টারসেপশন।
কন্ট্রোলার প্লাগইন কী?
Zend Framework এ Controller Plugin হলো এমন একটি ক্লাস যা কন্ট্রোলারের বিভিন্ন ফেজে ব্যবহৃত হয় এবং সিস্টেমের বিভিন্ন অংশে সাধারণ কার্যক্রমকে সাধারণীকৃত এবং পুনঃব্যবহারযোগ্য করে তোলে। কন্ট্রোলার প্লাগইন সাধারণত কন্ট্রোলারের dispatch মেথডে ব্যবহৃত হয়, যা ইউজারের রিকোয়েস্ট প্রক্রিয়া করে এবং কন্ট্রোলার অ্যাকশন রান করে।
কন্ট্রোলার প্লাগইন সাধারণত নিম্নলিখিত কাজগুলো করতে পারে:
- রিকোয়েস্ট অথবা রেসপন্স পরিবর্তন করা
- অ্যাকশন মেথডে বা কন্ট্রোলারের অন্য অংশে কিছু সাধারণ কাজ করা
- কিছু অতিরিক্ত লজিক প্রয়োগ করা, যেমন লগিং, অথেন্টিকেশন চেক করা, অথবা কাস্টম রাউটিং ফিল্টার প্রয়োগ করা
কন্ট্রোলার প্লাগইন তৈরি
কন্ট্রোলার প্লাগইন তৈরি করতে আপনাকে একটি ক্লাস তৈরি করতে হবে যা Zend\Mvc\Controller\Plugin\AbstractPlugin ক্লাস থেকে ইনহেরিট করবে। নিচে একটি কন্ট্রোলার প্লাগইন তৈরির উদাহরণ দেয়া হলো:
১. কন্ট্রোলার প্লাগইন তৈরি
ধরি, আপনি একটি LoggerPlugin তৈরি করতে চান, যা প্রতিটি কন্ট্রোলারের অ্যাকশন রান হওয়ার আগে লগিং করবে।
ফোল্ডার স্ট্রাকচার:
module/Application/src/Controller/Plugin/LoggerPlugin.php
LoggerPlugin.php:
<?php
namespace Application\Controller\Plugin;
use Laminas\Mvc\Controller\Plugin\AbstractPlugin;
use Laminas\Log\Logger;
use Laminas\Log\Writer\Stream;
class LoggerPlugin extends AbstractPlugin
{
protected $logger;
public function __construct()
{
// লগ লেখার জন্য একটি স্ট্রিম লেখক তৈরি করা হচ্ছে
$writer = new Stream('data/log/application.log');
$this->logger = new Logger();
$this->logger->addWriter($writer);
}
public function logAction($action)
{
// অ্যাকশন নামটি লগ করা হচ্ছে
$this->logger->info("Action executed: " . $action);
}
}
এখানে LoggerPlugin প্লাগইনটি logAction() মেথডে একটি সিম্পল লগিং ফাংশনালিটি প্রদান করে, যা প্রতিটি অ্যাকশন রানের সময় লগ ফাইলে অ্যাকশনের নাম লেখে।
২. কন্ট্রোলার প্লাগইন রেজিস্টার করা
এখন আপনি এই প্লাগইনটি কন্ট্রোলার অ্যাকশনে ব্যবহার করতে পারবেন। তবে, প্রথমে আপনাকে এই প্লাগইনটি আপনার অ্যাপ্লিকেশন কনফিগারেশন ফাইলে রেজিস্টার করতে হবে।
ফোল্ডার স্ট্রাকচার:
module/Application/config/module.config.php
module.config.php:
<?php
namespace Application;
return [
'controller_plugins' => [
'invokables' => [
'logger' => 'Application\Controller\Plugin\LoggerPlugin',
],
],
];
এখানে controller_plugins সেকশনে LoggerPlugin প্লাগইনটি রেজিস্টার করা হয়েছে।
৩. কন্ট্রোলারে প্লাগইন ব্যবহার
এখন আপনি আপনার কন্ট্রোলারে এই প্লাগইন ব্যবহার করতে পারবেন। প্লাগইনটি কন্ট্রোলারের dispatch মেথডের মধ্য দিয়ে ব্যবহার করা যায়।
ফোল্ডার স্ট্রাকচার:
module/Application/src/Controller/IndexController.php
IndexController.php:
<?php
namespace Application\Controller;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
class IndexController extends AbstractActionController
{
public function indexAction()
{
// Logger প্লাগইন ব্যবহার করা হচ্ছে
$this->logger->logAction('indexAction');
return new ViewModel();
}
}
এখানে, indexAction এ LoggerPlugin এর logAction() মেথড ব্যবহার করা হচ্ছে। যেকোনো সময় যখন indexAction কল হবে, এটি application.log ফাইলে লগ লিখে ফেলবে।
হুকস (Hooks) কী?
Zend Framework এ হুকস (Hooks) হল এমন ফাংশন বা মেথড যা অ্যাপ্লিকেশনের বিভিন্ন ফেজে ইন্টারসেপ্ট করতে এবং নির্দিষ্ট কার্যক্রম সম্পাদন করতে সাহায্য করে। একটি হুক সাধারণত একটি নির্দিষ্ট প্রক্রিয়ার মধ্যে কোড ইনজেক্ট করার জন্য ব্যবহৃত হয়।
Zend Framework এ কয়েকটি মূল হুক ব্যবহৃত হয়:
onDispatch(): কন্ট্রোলারেরdispatch()মেথড চালানোর আগে এই হুকটি কল হয়। এটি কন্ট্রোলারের কার্যকারিতা পরিবর্তন করতে পারে, যেমন লগিং, অথেন্টিকেশন চেক ইত্যাদি।onDispatchError(): যদি কন্ট্রোলারের কোনো অ্যাকশন চলাকালীন ত্রুটি ঘটে, তবে এই হুকটি কল হয়।onBootstrap(): অ্যাপ্লিকেশন বুটস্ট্র্যাপিং (শুরু) হওয়ার সময় এটি কল হয়। এটি সাধারণত মডিউল শুরু করতে ব্যবহৃত হয়।
কন্ট্রোলার হুক ব্যবহার করা
Zend Framework এ onDispatch() হুক ব্যবহার করা খুবই সাধারণ। উদাহরণস্বরূপ, একটি কন্ট্রোলারের onDispatch মেথড ব্যবহার করে আপনি একটি কাস্টম লজিক প্রয়োগ করতে পারেন, যেমন ইউজার অথেন্টিকেশন চেক করা।
IndexController.php:
<?php
namespace Application\Controller;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
class IndexController extends AbstractActionController
{
public function onDispatch(\Laminas\Mvc\MvcEvent $e)
{
// ইউজার অথেন্টিকেশন চেক
if (!$this->isAuthenticated()) {
// ইউজার অথেন্টিকেশন না থাকলে লগইন পেজে রিডাইরেক্ট করা হচ্ছে
return $this->redirect()->toRoute('login');
}
// onDispatch হুকের পরবর্তী অংশে রান করতে দেয়া হচ্ছে
return parent::onDispatch($e);
}
public function indexAction()
{
return new ViewModel();
}
private function isAuthenticated()
{
// এখানে ইউজার অথেন্টিকেশন চেকের লজিক থাকবে
return false; // উদাহরণস্বরূপ, আমরা নেগেটিভ চেক করছি
}
}
এখানে onDispatch() হুক ব্যবহার করে কন্ট্রোলারে ইউজারের অথেন্টিকেশন চেক করা হচ্ছে। যদি ইউজার অথেন্টিকেটেড না থাকে, তবে তাকে লগইন পেজে রিডাইরেক্ট করা হচ্ছে।
সারাংশ
Zend Framework (Laminas) এ Controller Plugins এবং Hooks ব্যবহার করে আপনার অ্যাপ্লিকেশনের কার্যকারিতা এবং লজিক আরও উন্নত করা যায়। কন্ট্রোলার প্লাগইনগুলি অ্যাপ্লিকেশনের যেকোনো অংশে সাধারণ কার্যক্রমের জন্য ব্যবহৃত হয়, যেমন লগিং বা ইউজার অথেন্টিকেশন চেক করা। হুকস (Hooks) ব্যবহার করে অ্যাপ্লিকেশনের নির্দিষ্ট ফেজে কোড ইনজেক্ট করা যায়, যেমন onDispatch() অথবা onBootstrap()। এই ক্ষমতাগুলি আপনাকে অ্যাপ্লিকেশনের মধ্যে কাস্টম কার্যক্রম সম্পাদন করতে সহায়তা করে।
Read more