Dạy thiết kế web - Hướng dẫn thiết kế web, Kỹ thuật thiết kế website

Tạo một MVC framework làm nền tảng cho một ứng dụng PHP

Xem kết quả: / 3
Bình thườngTuyệt vời 


Trong bài viết này, 5s sẽ walk through nhiều concept quan trọng của một ứng dụng để tạo nên một MVC framework thực sự hữu dụng cho các bạn mới bắt đầu.

Có được kíên thức MVC cơ bản, các bạn sẽ thấy thoải mái khi sử dụng những framework "pro" như Zend hay Symfony, CakePHP,... MVC cơ bản này cũng sẽ giúp bạn nếu đam mê xây dựng application architect phát triển bổ sung vào nó những công cụ hữu ích khác nếu muốn, tạo nên một framework hoàn chỉnh có thể dùng trong công việc hàng ngày mà ở đó bạn có thể kiểm soát hoàn toàn các đoạn code của mình.

MVC là mô hình gắn liền với mô hình ứng dụng 3 lớp mà chúng ta đã quen thuộc.

Xử lý tập trung
Xét với 1 ứng dụng web, do bản chất của nó là giao tiếp giữa client (web browser của người dùng) và server (web server) quan các lời gọi Request và trả lời Response, một ứng dụng web có thể cho user truy cập nhiều trang web khác nhau như index.php, user.php, view_product.php,... Việc này dẫn đến nhiều khó khăn khi hệ thống có những biến chia sẻ chung như setting, database access,... Thường thì chúng ta sẽ phải viết code như sau:

Code:

<?php
include ('global.php'); 
//Các biến dùng chung

// Các xử lý code khác

?>


Mô hình MVC sẽ thay đổi việc này bằng cách tập trung tất cả các request của user về một trang duy nhất: index.php sau đó sẽ xử lý bằng cách phân tích request và gọi đúng trang php cần thiết để xử lý. Việc tập trung này sẽ giúp các bạn tiến hành các bước kết nối DB, logging, error handling,... hết sức hiệu quả sau này. Tuy nhiên, trong serie này 5s không thể đề cập hết các chi tiết đó.

Trước tiên, ta sẽ tạo một file .htaccess để thực hiện rewrite URL, thay đổi request về file index.php sẽ có tham số route trong query string như sau:

file .htacess ngang cấp với index.php
Code:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]

Chú ý, nếu bạn chưa load module mod_rewrite của Apache, phải vào httpd.conf để sửa đổi cấu hình và restart Apache.

Ở đây, route là tham số dùng để thay đổi cách gọi request của user, nó giúp file index.php phân tích nội dung request để chuyển tới file php khác thực hiện xử lý thích hợp.

Cũng giống như thông tin cấu hình ở ví dụ trên, chúng ta sẽ làm vài việc gọi là initialize ứng dụng web của mình:
File index.php
Code:

require 'includes/init.php';

File includes/init.php
Code:

<?php
error_reporting 
(E_ALL); 
//Thông báo tất cả các lỗi
if (version_compare(phpversion(), '5.1.0''<') == true) { die ('PHP5.1 Only'); } 
//Framework của chúng ta làm việc trên PHP5

// Constants:
define ('DIRSEP'DIRECTORY_SEPARATOR); 
//Tương thích với môi trường Win hay Unix, ta tìm dúng dấu phân cách dir là  \ hay /

// Get site path
$site_path realpath(dirname(__FILE__) . DIRSEP '..' DIRSEP) . DIRSEP
;
define ('site_path'$site_path
);

Tiếp theo, tạo một biến registry để chứa các biến toàn cục trong ứng dụng. Sau này ta sẽ lưu vào đây các biến DB, Logger, Cache, Template,...

Code:

$registry = new Registry;

Vì chúng ta sẽ rất lười nhác phải viếc các hàm include file và vấn đề đang gặp phải là sẽ phải tạo file Registry.php (chú ý case sensitve nhé) cho class Registry ta đang dùng ở trên nên ta sẽ viết một hàm __autoload() cho PHP5 để nó tự load các file php ứng với class ta cần dùng:

Code:

function __autoload($class_name) {
        $filename = strtolower($class_name) . '.php';
        $file = site_path . 'classes' . DIRSEP . $filename;

        if (file_exists($file) == false) {
                return false;
        }

        include ($file);
}

Hàm này PHP5 tự động sẽ gọi khi không tìm thấy class cần dùng trong hệ thống, chúng ta cứ viết và để đó - không cần quan tâm gì thêm. Một điều 5s muốn các bạn chú ý là trong một framework, cách đặt tên các file, class, variable,... là rất quan trọng và ảnh hưởng tới cơ chế xây dựng framework, do đó, hãy đế ý tới tên họ các biến, class cho cẩn thận, nhất là chữ hoa/thường vì sau này upload lên host Linux sẽ gặp nhiều vấn đề.

Tạo class Registry
Chúng ta sẽ dùng object của Registry để pass dữ liệu lòng vòng trong ứng dụng tương tự như việc dùng Application['abc'] của ASP hay biến $GLOBALS của PHP.
Code:

<?php

Class Registry 
{
        private 
$vars 
= array();

function 
set($key$var
) {
        if (isset(
$this->vars[$key]) == true
) {
                throw new 
Exception('Unable to set var `' $key '`. Already set.'
);
        }

        
$this->vars[$key] = $var
;
        return 
true
;
}

function 
get($key
) {
        if (isset(
$this->vars[$key]) == false
) {
                return 
null
;
        }

        return 
$this->vars[$key
];
}

function 
remove($var
) {
        unset(
$this->vars[$key
]);
}
}

?>


Chúng ta vừa tạo một Dictionary class. Ý nghĩa của một từ điển là cứ cho tôi một từ khoá (key) tôi sẽ cho ý nghĩa của nó (value). Value-key pair cũng là khái niệm hay dùng nên bạn cũng nên nắm bắt luôn ở đây.


Ví dụ sử dụng Registry:
Code:

<?php

$registry 
= new Registry
;

// Set some data
$registry->set ('name''hung 5s'
);

// Get data, using get()
echo $registry->get ('name'
);

// Get data, using array access
echo $registry['name'
]

?>


Do tôi cũng lười typing và muốn nhấn mạnh một chút về OOP, ta sẽ implement một interface để biến đối tượng $registry mới tạo thành một array của PHP cho dễ dùng hơn.

Đầu tiên sửa lại class Registry:
Code:

class Registry Implements ArrayAccess {

Sau đó implement 4 method của interface ArrayAccess như sau:

Code:

function offsetExists($offset) {
        return isset($this->vars[$offset]);
}

function offsetGet($offset) {
        return $this->get($offset);
}

function offsetSet($offset, $value) {
        $this->set($offset, $value);
}

function offsetUnset($offset) {
        unset($this->vars[$offset]);
}

Bây giờ bạn có thể viết $registry['name'] = 'abc' thay vì $registry->set('name', 'abc'); khoái chí không nào. Nếu bạn muốn ứng dụng cái này ở class nào đó cho riêng mình để có thêm vòng lặp foreach chẳng hạn thì bạn thử implement thêm interface Iterator nữa nhé.
Nguôn http://thegioiweb.vn/Story/vn/laptrinhweb/laptrinhweb_PHP/2008/7/5920.html
 
 

Khắc phục lỗi

Công cụ thiết kế website

Top 10 Add-on “hot” cho Firefox Top 10 Add-on “hot” cho Firefox Firefox vẫn nổi tiếng với hệ ...
Tool upload và download từ server Tool upload và download từ server FTP Commander 7.40 - chương trình ...
Một số trang web cung cấp tool online Một số trang web cung cấp tool online 1. Web 2.0 Badges – Tạo badges ...
Tool hỗ trợ làm flash mạnh mẽ nhất Tool hỗ trợ làm flash mạnh mẽ nhất Với SWiSH Max2 bạn có thể ...
Firebug -kiểm tra website Firebug -kiểm tra website Firebug là một công cụ chủ ...

Ebook

Ebooks Flash CS3 (english) Foundation Flash CS3 for Designers What you’ll ...
24h học Action scipts Dưới đây là tài liệu dùng để học action ...
Ebook học JavaScript Ebook học JavaScript bao gồm cả Tiếng Anh và ...
Ebook web nghe nhạc trực tuyến Bạn đang có ý định làm một website nghe ...
Tài liệu tiếng việt về PHP Biên soạn bởi: Mr. Cảnh Phúc Hiệu trưởng ...

Tin tức

Những tên miền Những tên miền "nguy hiểm nhất thế giới" Đó là những tên miền quốc gia Cameroon (.cm), ...
Tạo website trực tuyến, chuyên nghiệp, miễn phí Tạo website trực tuyến, chuyên nghiệp, miễn phí Nhằm phục vụ cho nhu cầu học tập, trao đổi, ...
Thiết kế Website và Làm thế nào để có 1 website ? Thiết kế Website và Làm thế nào để có 1 website ? Để có một website bạn phải tiến hành những ...
Các loại website Các loại website Có rất nhiều loại website nhưng có thể phân ...
Domain là gì ? Domain là gì ? Tên miền (Domain name) là định danh của website ...

Thăm dò

Bạn quan tâm về website ở điểm nào ?