Bộ điều khiển trong MVC framework tự tạo bằng PHP
Như bạn đã biết, tất cả các bộ điều khiển của
framework chúng ta đều có phương thức render, cần
được gọi để gửi dữ liệu đến view.
Phương thức này được các bộ điều khiển do người dùng định nghĩa
kế thừa từ lớp cha Controller,
nằm trong core. Hãy tạo lớp này:
<?php
namespace Core;
class Controller
{
protected function render($view, $data) {
}
}
?>
Như bạn thấy, phương thức render nhận tham số
là tên view và dữ liệu để
hiển thị. Hãy để phương thức này trả về
đối tượng của lớp đặc biệt Page, trong
đó sẽ chứa thông tin về view
dữ liệu của action controller. Lớp này
sẽ chứa tên view, dữ liệu,
cũng như tiêu đề trang và tên file layout
của trang web:
<?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;
}
}
?>
Khi đó, code của phương thức render của chúng ta sẽ
trông như thế này:
<?php
namespace Core;
class Controller
{
protected $layout = 'default';
protected function render($view, $data) {
return new Page($this->layout, $this->title, $view, $data);
}
}
?>
Hãy để tôi giải thích điều gì đang xảy ra ở đây. Tên view
và dữ liệu được truyền vào qua tham số của phương thức. Tuy nhiên,
trong bộ điều khiển do người dùng định nghĩa còn có
tiêu đề trang được thiết lập - bằng cách ghi vào thuộc tính
title. Điều đó có nghĩa là trong $this->title
sẽ chứa tiêu đề mà chúng ta sẽ truyền cho
hàm tạo của lớp Page.
Cũng có những điểm cần lưu ý về layout. Như bạn biết,
framework của chúng ta sử dụng layout từ file
default.php. Trên thực tế, mỗi
action có thể có một layout khác. Để
làm điều này, cần ghi một tên layout khác vào thuộc tính layout
trong chính action đó.
Cách đạt được điều này: bộ điều khiển cha của chúng ta
có thuộc tính layout, mặc định
có giá trị 'default.php'. Đây
sẽ là layout mặc định. Tuy nhiên, nếu
action của bộ điều khiển người dùng ghi đè
giá trị thuộc tính layout, thì layout
sẽ khác.
Sao chép code lớp Controller của tôi và đặt nó vào file
/core/Controller.php.
Sao chép code lớp Page của tôi và
đặt nó vào file /core/Page.php.