পিএইচপিতে আপনার নিজস্ব এমভিসি ফ্রেমওয়ার্কে কন্ট্রোলারগুলি

আপনি ইতিমধ্যেই জানেন যে, আমাদের ফ্রেমওয়ার্কের সকল কন্ট্রোলারে render মেথডটি থাকে, যাকে ভিউতে ডেটা পাঠানোর জন্য কল করতে হবে। এই মেথডটি আমাদের, ইউজার-ডিফাইন্ড কন্ট্রোলারগুলি Controller নামক একটি প্যারেন্ট ক্লাস থেকে ইনহেরিট করে, যেটি কোর-এ অবস্থিত। আসুন এই ক্লাসটি তৈরি করি:

/core/Controller.php<?php
  namespace Core;
  
  class Controller
  {
    protected function render($view, $data) {
      
    }
  }
?>

আপনি দেখতে পাচ্ছেন, render মেথডটি প্যারামিটার হিসেবে ভিউ-এর নাম এবং ডিসপ্লে করার জন্য ডেটা নেয়। ধরা যাক এই মেথডটি একটি স্পেশাল ক্লাস Page-এর অবজেক্ট রিটার্ন করে, যেখানে কন্ট্রোলার একশনের ডেটা ডিসপ্লে করার জন্য প্রয়োজনীয় তথ্য থাকবে। এই ক্লাসে ভিউ-এর নাম, ডেটা, পাশাপাশি পেজের টাইটেল এবং সাইট লেআউট ফাইলের নাম থাকবে:

/core/Page.php<?php
  namespace Core;
  
  class Page
  {
    private $layout;
    private $title;
    private $view;
    private $data;
    
    public function __construct($layout, $title, $view, $data)
    {
      $this->layout = $layout;
      $this->title  = $title;
      $this->view   = $view;
      $this->data   = $data;
    }
    
    public function __get($property)
    {
      return $this->$property;
    }
  }
?>

তাহলে আমাদের render মেথডের কোডটি দেখতে এমন হবে:

/core/Controller.php<?php
  namespace Core;
  
  class Controller
  {
    protected $layout = 'default';
    
    protected function render($view, $data) {
      return new Page($this->layout, $this->title, $view, $data);
    }
  }
?>

এখানে কী ঘটছে তা ব্যাখ্যা করি। ভিউ-এর নাম এবং ডেটা মেথডের প্যারামিটার হিসেবে আসে। তবে, ইউজার-ডিফাইন্ড কন্ট্রোলারে পেজের টাইটেলও সেট করা থাকে - title প্রপার্টি লিখে। এর মানে হল, $this->title-এ সেই টাইটেলটি থাকবে, যেটি আমরা Page ক্লাসের কনস্ট্রাক্টরে পাঠাব।

লেআউট নিয়েও কিছু নুয়ান্স আছে। আপনি জানেন, আমাদের ফ্রেমওয়ার্ক default.php ফাইল থেকে লেআউট ব্যবহার করে। বাস্তবে, প্রতিটি একশনের একটি ভিন্ন লেআউট থাকতে পারে। এর জন্য একশন নিজেই layout প্রপার্টিতে অন্য একটি লেআউটের নাম সেট করতে হবে।

এটি কীভাবে অর্জন করা হয়: আমাদের প্যারেন্ট কন্ট্রোলারটির layout নামক একটি প্রপার্টি আছে, ডিফল্টভাবে যার মান 'default.php'। এটি ই হবে ডিফল্ট লেআউট। তবে, যদি ইউজার-ডিফাইন্ড কন্ট্রোলারের একশন layout প্রপার্টির মান ওভাররাইড করে, তাহলে লেআউটও ভিন্ন হবে।

Задание 1

আমার Controller ক্লাসের কোড কপি করুন এবং এটিকে /core/Controller.php ফাইলে রাখুন।

Задание 2

আমার Page ক্লাসের কোড কপি করুন এবং এটিকে /core/Page.php ফাইলে রাখুন।