ตัวควบคุมใน MVC Framework ของเราใน PHP
ดังที่คุณทราบแล้ว ตัวควบคุมทั้งหมดใน framework ของเรามีเมธอด render ซึ่งจำเป็นต้องเรียกใช้เพื่อส่งข้อมูลไปยัง view เมธอดนี้ถูกสืบทอดโดยตัวควบคุมของผู้ใช้จากคลาสแม่ Controller ที่อยู่ในส่วน core มาเริ่มสร้างคลาสนี้กัน:
<?php
namespace Core;
class Controller
{
protected function render($view, $data) {
}
}
?>
คุณจะเห็นว่า เมธอด render รับพารามิเตอร์เป็นชื่อ view และข้อมูลสำหรับแสดงผล กำหนดให้เมธอดนี้ส่งคืนอ็อบเจ็กต์ของคลาสพิเศษ Page ซึ่งจะมีข้อมูลเกี่ยวกับการแสดงผลของการกระทำ (action) ของตัวควบคุม ในคลาสนี้จะมีชื่อ view, ข้อมูล รวมถึง title ของหน้าและชื่อไฟล์ layout ของเว็บไซต์:
<?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 ของเราจะมีหน้าตาดังนี้:
<?php
namespace Core;
class Controller
{
protected $layout = 'default';
protected function render($view, $data) {
return new Page($this->layout, $this->title, $view, $data);
}
}
?>
อธิบายสิ่งที่เกิดขึ้นตรงนี้ ชื่อ view และข้อมูลถูกส่งผ่านมาเป็นพารามิเตอร์ของเมธอด อย่างไรก็ตาม ในตัวควบคุมของผู้ใช้ยังมีการกำหนด title ของหน้าโดยการกำหนดค่าให้กับพร็อพเพอร์ตี้ title ดังนั้นใน $this->title จะมี title ที่เราจะส่งต่อไปยัง constructor ของคลาส Page
นอกจากนี้ยังมีรายละเอียดเกี่ยวกับ layout อย่างที่คุณทราบ Framework ของเราใช้ layout จากไฟล์ default.php อันที่จริงแต่ละ action อาจมี layout อื่นก็ได้ สำหรับสิ่งนี้ ต้องกำหนดชื่อ layout อื่นให้กับพร็อพเพอร์ตี้ layout ใน action นั้นเอง
วิธีการทำเช่นนี้: ตัวควบคุมแม่ของเรามีพร็อพเพอร์ตี้ layout ซึ่งค่าเริ่มต้นคือ 'default.php' นี่จะเป็น layout มาตรฐาน อย่างไรก็ตาม หาก action ของตัวควบคุมผู้ใช้เปลี่ยนแปลงค่าของพร็อพเพอร์ตี้ layout นี้ layout ก็จะเปลี่ยนไปด้วย
คัดลอกโค้ดคลาส Controller ของฉันและวางไว้ในไฟล์
/core/Controller.php
คัดลอกโค้ดคลาส Page ของฉันและวางไว้ในไฟล์ /core/Page.php