P H P  V I E T  N A M  P O R T A L
Xin chào, Khách. Vui lòng đăng nhập hoặc đăng ký tài khoản.
Bạn đã quên email kích hoạt?






     Trang chủ | Download | Tự học PHP | Kho tư liệu | Diễn đàn
Trang: [1]
  In  
Current Topic Rating: ***
You have not rated this topic. Select a rating:
Tác giảChủ đề: MVC framework (phần 3)  (Đã đọc 11131 lần)
phpKungFu
For a better united PHP community in Vietnam
Administrator
PHP Intermediate
*****
Posts: 418


Flattern the world


Xem hồ sơ WWW
« on: January 07, 2008, 12:30:47 AM »

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ỏ Grin. 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... Wink

Đầ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:
Code:
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 Grin giờ thực hành tiếp:

Code:
<?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.
Code:
# 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ử:
Code:
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 Grin

bổ sung hàm show($templateName) vào class Template
Code:
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
Code:
<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.
Logged

Twitter: http://twitter.com/phpKungFu
-------------------------------------
Flexica Solutions
http://www.webflexica.com
mygod
PHP Intermediate
*
Posts: 33



Xem hồ sơ Email
« Trả lời #1 on: January 07, 2008, 09:29:07 AM »

chưa kịp đọc, nhưng cứ thanks trước!!

Mình rất cần cái này. Cool

À, mình có thắc mắc nhỏ: mình đang tính nghiên cứu 1 framework (tất nhiên là sau khi "học hỏi" hung5s) Cheesy.

mình đang phân vân ko biết nên chọn thằng nào: cakephp or zend? sao mình thấy thằng cakephp có 1mb à, còn thằng zend tới 10mb lận(ko hiểu nó support cái gì mà ghê thế)??.

nếu ai có kinh nghiệm gì, cho mình 1 lời khuyên nha! Huh

Thanks everyone!!!
Logged

Bút sa gà...đá
phpKungFu
For a better united PHP community in Vietnam
Administrator
PHP Intermediate
*****
Posts: 418


Flattern the world


Xem hồ sơ WWW
« Trả lời #2 on: January 07, 2008, 07:07:35 PM »

Giờ này Zend đã ổn định rồi và sẽ support tốt hơn các framework khác. Nếu bạn dùng thì cứ zend zend zend thôi Grin chừng nào phải đi là out sourcing thì framework nào cũng phải phang hết thì mới có sẵn sàng với khách hàng.
Logged

Twitter: http://twitter.com/phpKungFu
-------------------------------------
Flexica Solutions
http://www.webflexica.com
whitelion
PHP Intermediate
*
Posts: 156



Xem hồ sơ Email
« Trả lời #3 on: January 07, 2008, 10:51:07 PM »

Zend tuy 10MB nhưng đâu nhất thiết phải dùng hết, cái nào cần dùng thì đễ.. ko liên wan thì del thôi  Grin
Logged

Có ai có project nào ko, mình tham gia với! Chán we'! (để học hỏi thôi) Wink. Y!ID: nguyenkhado
phpKungFu
For a better united PHP community in Vietnam
Administrator
PHP Intermediate
*****
Posts: 418


Flattern the world


Xem hồ sơ WWW
« Trả lời #4 on: January 07, 2008, 11:43:18 PM »

Một điều không thích ở zend là quy định convention không được thuận tay để code cho lắm, nhưng đề nghị anh em phpvn.org dùng Zend hết đêeeeeeeeeee Grin Sau này khi có điều kiện sẵn sàng có thể teamwork với nhau nhiều prj nữa chứ.

Note: Serie bài MVC framework của 5s chỉ hy vọng là xây dựng bộ MVC cơ bản, khá chuẩn và bài bản để anh em newbie có cơ hội 'né' những framework hầm hố trên mạng, tập trung vào nghiên cứu php và OOP, tập phân tích, thiết kế và mở rộng kiến trúc hệ thống.

Còn một khi đã đi làm project thì phải dùng một cái MVC xịn xịn cho client nghe nó sợ Grin

Cũng mong rằng anh em đừng vì ham làm mà bỏ rơi thằng MVC này. Làm coder mà chỉ đi code dự án thì đúng là chán hết biết Wink
Logged

Twitter: http://twitter.com/phpKungFu
-------------------------------------
Flexica Solutions
http://www.webflexica.com
mygod
PHP Intermediate
*
Posts: 33



Xem hồ sơ Email
« Trả lời #5 on: January 08, 2008, 03:07:49 AM »

thanks everyone!!

sau khi nghiên cứu topic của hung5s xong, có lẽ thử sức với zend (hình như cũng có người viết bài về nó rồi).

hi vong diễn đàn lúc nào cũng hot!!! Roll Eyes Cheesy
Logged

Bút sa gà...đá
tranminhnghia
PHP Starter
*
Posts: 4


Xem hồ sơ Email
« Trả lời #6 on: December 30, 2011, 09:25:11 AM »

hic, em chạy bị lỗi này
Fatal error: Call to a member function set() on a non-object in F:\AppServ\www\MVC\mymvc\controller\index.php on line 6
Logged
Trang: [1]
  In  
 
Chuyển sang:  

Powered by SMF 1.1.15 | SMF © 2006-2007, Simple Machines . Modified by PHPVN Members