Qua được phần 2, chắc anh em vẫn còn chưa hứng thú lắm vì framework này mới chỉ show off một phần nội lực nho nhỏ

. Hiển thị dữ liệu tới người dùng (View) mới là một trong những phần vô cùng hấp dẫn và gần như là có thể mở rộng vô bờ bến.
Trên thực tế thì phần Controller, mỗi người thiết kế ứng dụng có những cách tiếp cận khác nhau, nhiều cách tiếp cận sử dụng chain processing hay một vài design pattern phức tạp. Tuy nhiên quanh đi quẩn lại thì design 1 hồi xong rồi nó cũng sẽ fix cứng ở đó, không thay đổi gì nữa. Phần mở rộng nhiều nhất có lẽ là phần View, vì vậy 5s ngồi thêm 1 ngày design phần này tương đối "rộng cửa" một chút để khi sử dụng sau này, mọi người có thể viết thêm nhiều helper hữu ích.
Let's go...

Đầu tiên ta đi làm một cái class chuẩn để xử lý dữ liệu truyền vào từ Controller. Tại sao lại nó là truyền vào từ controller ? đây là cái các bạn nên để ý vì nó là cơ bản của kiến trúc ứng dụng 3 tier: Giao diện (View) - Xử lý (Controller) - Dữ liệu (Model). Phần xử lý, chúng ta đã thực hiện ở các controller và nhiệm vụ của View (giao diện) là phải thể hiện những kết quả đã được xử lý cho user. Để tuân thủ chặt chẽ quy định của mô hình 3 tier, trong phần giao diện tuyệt đối cấm coder không viết các đoạn code có ngữ nghĩa cụ thể để giải quyết các vấn đề logic về chức năng.
Sau đây là 1 ví dụ để bạn nắm bắt ý nghĩa của 3 tier rõ ràng hơn, sau này lập trình tránh không bị nhầm lẫn giữa code hiển thị dữ liệu và code xử lý logic:
Yêu cầu: Xem thông tin của một member trong forum, hiển thị số post của người đó và show ra link tới 5 latest post.
Xử lý:
- Gọi model để lấy thông tin user
- Xử lý đếm tổng số bài post của user, đây là 1 bước xử lý logic trong đó có gọi Model để truy vấn dữ liệu
- Xử lý lấy subject 5 bài post cuối cùng của user (tương tự trên)
- Lưu số bài post vào biến $totalPosts, 5 objects của 5 bài latest post vào 1 array $latest5Posts
- Truyền cho View 3 thông số: $user, $totalPosts và $latest5Posts
- View sẽ truy cập các property của $user để hiện thông tin user, có format ngày sinh, điện thoại,... tương tự format $totalPost là $totalPosts. ' bài viết', và dùng vòng lặp foreach để show ra 5 latest posts.
Đã hết lý thuyết

giờ thực hành tiếp:
<?php
class Template {
private $registry;
private $vars = array();
function __construct($registry) {
$this->registry = $registry;
}
public function set($varname, $value, $overwrite=false) {
if (isset($this->vars[$varname]) == true AND $overwrite == false) {
trigger_error ('Unable to set var `' . $varname . '`. Already set, and overwrite not allowed.', E_USER_NOTICE);
return false;
}
$this->vars[$varname] = $value;
return true;
}
public function remove($varname) {
unset($this->vars[$varname]);
return true;
}
}
?>
Như đã nói, $vars chính là biến để chứa các thông tin truyền vào từ Controller.
Tới đây, ta cần tạo ra 1 object của class Template để xử dụng. Chú ý rằng do mỗi request từ user tới server đều cần trả về một HTML page, nên để đỡ mất công trong phần controller ta phải new ra một biến $template, việc new này sẽ làm ngay tại file index.php để tiết kiểm coding
Cần thêm vào phía trứơc các dòng về route vì trong route khi gọi delegate thì yêu cầu đã được xử lý xong.
# Load template object
$template = new Template($registry);
$registry->set ('template', $template);
Quay lại trang /controllers/index.php, ta thêm code vào function index($params) để test thử:
function index($params) {
$this->registry['template']->set ('message', 'Hello, I am passed from index controller.');
$this->registry['template']->show('index');
}
Do ta chưa viết hàm show() nên bạn mà hăm hở chạy là sẽ bị lỗi

bổ sung hàm show($templateName) vào class Template
function show($templateName) {
$path = site_path . 'templates' . DIRSEP . $templateName . '.php';
if (file_exists($path) == false) {
trigger_error ('Template `' . $templateName . '` does not exist.', E_USER_NOTICE);
return false;
}
// Load variables for easy access
foreach ($this->vars as $key => $value) {
$$key = $value;
}
include ($path);
}
Ở đây có vài điểm đáng chú ý:
- Chúng ta quy định rằng các file template sẽ đặt trong folder /templates ngang cấp với index.php
- Đoạn code tôi comment là load variables for easy access tạo ra các biến $$key lấy ra từ $vars của object $template. Từ đó, bạn có thể dễ dàng sử dụng $message truyền vào từ controller trong file template của mình thay vì dùng $vars['message']
- Bạn phải đi tạo ra template (như đã nói là lưu trong /templates) để thực sự hiển thị dữ liệu
Ví dụ /templates/index.php
<h1><?php echo $message ?></h1>
Tới đây, bạn đã có cơ chế xử lý view hoàn chỉnh. Để chi tiết hơn, các bạn cần nắm được rằng với cách tổ chức View như thế này ta thực sự đã làm được 2 chuyện:
- Viết ứng dụng theo cách code behind của ASP.NET
- Bạn có thể tạo ra vô số các view, mỗi view bạn hãy coi như một form như khi làm ứng dụng Windows form.
- Một form tương tự với một action bạn muốn xử lý hoặc bạn có thể gom nhiều xử lý dùng chung 1 form.
Điểm thứ 3 là điểm rất hay mà MVC mang lại cho bạn. Với cách thiết kế như thế này, bạn rất dễ dàng quản lý các view, mỗi view không quá dài, không quá phức tạp về thiết kế giao dịên.
Với cách thiết kế class Template và load file template bằng đoạn include($path) trên, thực tế ta luôn chỉ có 1 class Template trong khi view là một đoạn php/html được viết rất tự do mà công việc thiết kế có thể giao cho designer không biết về code thực hiện.
Mô hình này cũng có thể dùng để sử dụng chung với Smarty template là một bộ template engine có nhiều tool và formatter rất hữu dụng. Tuy nhiên, tôi không làm nhiều lắm về Smarty nên các bạn sau khi tìm hiểu sơ về Smarty có thể thay thế class Template phần show() để tích hợp Smarty - third party component đầu tiên của chúng ta vào framework MVC này.
Tôi sẽ kết thúc bài này ở đây với đề nghị các bạn tích hợp Smarty vào MVC. Sau khi tích hợp xong, xin đảm bảo tinh thần bạn sẽ phấn khích hơn vài phần khi cảm nhận được một cấu trúc ứng dụng mà luôn sẵn sàng cho chúng ta mở rộng và tích hợp nhiều thành phần vào hệ thống.
Phần 4, tôi vẫn sẽ tiếp tục với View để minh hoạ thêm về cách mở rộng class Template này, viết các helper/formatter class và thử múa may một chút để tạo ra Master Template tương tự như của ASP.NET, giúp các bạn "tinh lọc" toàn bộ những thứ HTML code phức tạp ra khỏi template của mình.