Tài liệu Khóa luận Xây dựng nền tảng hỗ trợ lập trình web dựa trên mô hình MVC: ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Bùi Xuân Thăng
XÂY DỰNG NỀN TẢNG HỖ TRỢ LẬP TRÌNH WEB
DỰA TRÊN
MÔ HÌNH MVC
KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY
Ngành: Công Nghệ Thông Tin
HÀ NỘI - 2010
ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Bùi Xuân Thăng
XÂY DỰNG NỀN TẢNG HỖ TRỢ LẬP TRÌNH WEB
DỰA TRÊN
MÔ HÌNH MVC
KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY
Ngành: Công Nghệ Thông Tin
Cán bộ hướng dẫn: TS.Trương Ninh Thuận
HÀ NỘI - 2010
LỜI CẢM ƠN
Lời đầu tiên, tôi xin gửi lời cảm ơn chân thành tới thầy giáo, Tiến sĩ Trương Ninh Thuận,
người đã hướng dẫn và chỉ bảo tận tình cho tôi trong suốt quá trình học tập cũng như thực
hiện khóa luận tốt nghiệp này.
Tôi cũng xin cảm ơn các thầy, cô giáo đã chỉ dạy trong suốt thời gian gian tôi học tập tại
trường Đại học Công Nghệ - Đại học Quốc Gia Hà Nội. Cảm ơn các bạn Hoàng Đình
Quang, Nguyễn Văn Vũ, Phan Trọng Khanh, Đàm Thanh Tùng, những người bạn tốt đã
giúp đỡ tôi về mặt kỹ thu...
46 trang |
Chia sẻ: haohao | Lượt xem: 1193 | Lượt tải: 0
Bạn đang xem trước 20 trang mẫu tài liệu Khóa luận Xây dựng nền tảng hỗ trợ lập trình web dựa trên mô hình MVC, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Bùi Xuân Thăng
XÂY DỰNG NỀN TẢNG HỖ TRỢ LẬP TRÌNH WEB
DỰA TRÊN
MÔ HÌNH MVC
KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY
Ngành: Công Nghệ Thông Tin
HÀ NỘI - 2010
ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Bùi Xuân Thăng
XÂY DỰNG NỀN TẢNG HỖ TRỢ LẬP TRÌNH WEB
DỰA TRÊN
MÔ HÌNH MVC
KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY
Ngành: Công Nghệ Thông Tin
Cán bộ hướng dẫn: TS.Trương Ninh Thuận
HÀ NỘI - 2010
LỜI CẢM ƠN
Lời đầu tiên, tôi xin gửi lời cảm ơn chân thành tới thầy giáo, Tiến sĩ Trương Ninh Thuận,
người đã hướng dẫn và chỉ bảo tận tình cho tôi trong suốt quá trình học tập cũng như thực
hiện khóa luận tốt nghiệp này.
Tôi cũng xin cảm ơn các thầy, cô giáo đã chỉ dạy trong suốt thời gian gian tôi học tập tại
trường Đại học Công Nghệ - Đại học Quốc Gia Hà Nội. Cảm ơn các bạn Hoàng Đình
Quang, Nguyễn Văn Vũ, Phan Trọng Khanh, Đàm Thanh Tùng, những người bạn tốt đã
giúp đỡ tôi về mặt kỹ thuật trong quá trình nghiên cứu, xây dựng sản phẩm được trình bày
trong khóa luận tốt nghiệp này.
Ngoài ra, tôi muốn gửi lời cám ơn tới bố mẹ, người thân trong gia đình - những người đã
hết sức ủng hộ, giúp đỡ và động viên tôi trong suốt quá trình học tập đã qua.
Cuối cùng, tôi xin gửi lời cám ơn chân thành và sâu sắc tới Ban Giám đốc công ty TNHH
ISDS đã tạo mọi điều kiện về cơ sở vật chất giúp tôi hoàn thành khóa luận này.
TÓM TẮT KHÓA LUẬN
Khóa luận tốt nghiệp này trình bày một số hiểu biết cơ bản về các nền tảng hỗ trợ lập
trình ứng dụng web (Web application framework) và mô hình MVC (Model View
Controller) cũng như vai trò của các thành phần MVC trong Web framework. Qua đó giới
thiệu một framework tự xây dựng bằng ngôn ngữ PHP với các ưu điểm về cấu trúc và tốc
độ so với các PHP framework hiện nay. Framework được đặt tên là Hiphop framework.
Phần chính của khóa luận tập trung giải thích phương thức vận hành của ứng dụng được
xây dựng bằng Hiphop, bước đầu giúp các nhà phát triển nắm được cách thức xây dựng
ứng dụng trên Hiphop.
Phần cuối của khóa luận giới thiệu các thư viện, hàm tích hợp trong Hiphop hỗ trợ người
lập trình trong quá trình phát triển ứng dụng
5
MỤC LỤC
CHƯƠNG 1: KHÁI NIỆM VỀ WEB APPLICATION FRAMEWORK VÀ MÔ HÌNH MVC.... 8
1.1 Web Application Framework là gì? ................................................................................... 8
1.2. PHP Framework ........................................................................................................... 8
1.3 MVC là gì?.................................................................................................................... 9
1.3.1. Lịch sử MVC............................................................................................................. 9
1.3.2. Vai trò của các thành phần M-V-C trong Web framework ....................................... 10
CHƯƠNG 2. GIỚI THIỆU FRAMEWORK ĐÃ XÂY DỰNG ................................................. 15
2.1. Tổng quan về framework đã xây dựng ............................................................................ 15
2.2. Kiến trúc của Hiphop framework.................................................................................... 18
2.2.1 Tổng quát về hệ thống thư mục trong Hiphop framework ......................................... 18
2.2.2 Các thành phần cốt lõi .............................................................................................. 19
CHƯƠNG 3. CÁC KHÁI NIỆM BAN ĐẦU KHI XÂY DỰNG ỨNG DỤNG WEB BẰNG
HIPHOP FRAMEWORK ......................................................................................................... 25
3.1. Hiphop URLs ............................................................................................................. 25
3.2. Các lớp Controller ...................................................................................................... 25
3.3. View - Template......................................................................................................... 27
3.4. Các lớp Model ............................................................................................................ 30
CHƯƠNG 4: HỆ THỐNG CÁC LỚP THƯ VIỆN VÀ HÀM HỖ TRỢ .................................... 32
4.1 Các lớp thư viện ............................................................................................................. 32
4.1.1. Email library............................................................................................................ 32
4.1.2. Database library....................................................................................................... 33
4.1.3. Phân trang với Pagination class................................................................................ 35
4.1.4. Quản lý Session PHP với session class .................................................................... 35
4.1.5. Tạo hình ảnh Captcha với Captcha class ................................................................. 35
4.1.6. Tải file lên server với Upload class...................................................................... 35
4.1.7. Tải file với giao thức FTP - FTP class................................................................. 35
4.2 Các Helper ..................................................................................................................... 38
4.2.1. Array Helper............................................................................................................ 38
4.2.2. Text Helper.............................................................................................................. 38
4.2.3. URL helper.............................................................................................................. 40
CHƯƠNG 5: ÁP DỤNG HIPHOP FRAMEWORK XÂY DỰNG TRANG BLOG CÁ NHÂN 41
KẾT LUẬN .............................................................................................................................. 45
6
DANH SÁCH CÁC HÌNH ẢNH
Hình 1 1: Mô hình MVC.............................................................................................9
Hình 1 2: Biểu đồ tuần tự một chuỗi MVC đơn giản....Error! Bookmark not defined.
Hình 2 1: Mô hình MVC được áp dụng trong Hiphop frameworkError! Bookmark not
defined.
Hình 2 2: Cấu trúc cây thư mục Hiphop framework .....Error! Bookmark not defined.
Hình 2 3: Quy trình xử lý một HTTP request - Hiphop frameworkError! Bookmark not
defined.
Hình 2 4: Mô phỏng cấu trúc các thành phần cốt lõi trong Hiphop framework....Error!
Bookmark not defined.
Hình 2 5: Lớp Registry ..............................................................................................20
Hình 2 6: Lớp Router.................................................................................................21
Hình 2 7: Lớp Output.................................................................................................21
Hình 2 8: Lớp Loader ................................................................................................21
Hình 2 9: Lớp Controller ...........................................................................................22
Hình 3 1: Ví dụ một URL Hiphop framework..............Error! Bookmark not defined.
Hình 3 2: Minh họa Sơ đồ phân cấp controller trang webError! Bookmark not defined.
Hình 3 3: blogview.php................................................Error! Bookmark not defined.
Hình 3.4: header_view.php ..........................................Error! Bookmark not defined.
Hình 5 1: Giao diện Blog ...........................................................................................41
7
LỜI MỞ ĐẦU
Trong những năm gần đây, các ứng dụng web lớn liên tục được tạo ra, đánh dấu những
bước phát triển nhảy vọt về công nghệ trong thế giới lập trình. Các nền tảng hộ trợ lập
trình cũng được xây dựng hàng loạt nhằm mục đích chính là cải thiện tốc độ thực thi và
nâng cao tính bảo mật cho các ứng dụng web. Các nền tảng hỗ trợ lập trình ứng dụng
(application framework) đều chứa đựng các kinh nghiệm của các nhà kiến trúc phần mềm
sau nhiều năm chiêm nghiệm trong thế giới lập trình.
Với nỗ lực làm giảm thời gian phát triển một ứng dụng web, bằng việc học hỏi và tiếp thu
những ưu điểm của các framework hiện nay, chúng tôi đã xây dựng được một nền tảng hỗ
trợ lập trình các ứng dụng web được viết bằng ngôn ngữ PHP. Khóa luận này trình bày
các khái niệm cần thiết trước khi bắt tay xây dựng một nền tảng lập trình, đồng thời giới
thiệu nền tảng mà chúng tôi đã xây dựng thành công.
8
CHƯƠNG 1: KHÁI NIỆM VỀ WEB APPLICATION
FRAMEWORK VÀ MÔ HÌNH MVC
1.1 Web Application Framework là gì?
“Web application framework” là một nền tảng phần mềm được thiết kế để hỗ trợ việc
phát triển các website động, các ứng dụng web và các dịch vụ web. Mục đích của
Framework là nhắm tới việc giảm bớt các hao phí liên quan tới các hoạt động thực hiện
trong quá trình phát triển web. Ví dụ, nhiều framework cung cấp thư viện để truy cập cơ
sở dữ liệu, khung khuôn mẫu và quản lý phiên làm việc, thêm vào đó làm tăng khả năng
tái sử dụng mã.
1.2. PHP Framework
PHP framework là web framework được viết bằng PHP - một ngôn ngữ lập trình nguồn
mở phổ biến nhất hiện nay. Nội dung khóa luận đề cập tới PHP Framework là do PHP là
ngôn ngữ rất linh hoạt, được các lập trình viên ưa chuộng sử dụng khi tiến hành xây dựng
các ứng dụng web cỡ lớn (Facebook, Flickr, Twitter…). Bên cạnh đó PHP có một cộng
đồng sử dụng lớn, luôn biết hỗ trợ lần nhau. Nhưng chính tính linh hoạt, dễ học, dễ sử
dụng của PHP đôi khi làm các lập trình viên chủ quan, thường chỉ chú ý tới việc ứng dụng
của mình chạy được hay không mà không quan tâm tới tính sáng sủa trong việc tổ chức
mã phục vụ cho mục đích bảo trì dài lâu. Chưa kể tới việc vấn đề an toàn, bảo mật cho
ứng dụng web ngày càng bị xem nhẹ. Đây là lúc họ cần tới một PHP framework.
Sự có mặt của PHP framework làm cho việc phát triển ứng dụng web trở nên trôi chảy
hơn bằng việc cung cấp một cấu trúc cơ bản để xây dựng những ứng dụng đó. Hay nói
cách khác, PHP Framework giúp đỡ các lập trình viên thúc đẩy nhanh chóng quá trình
phát triển ứng dụng, tiết kiệm được phần lớn thời gian, tăng sự ổn định cho ứng dụng, và
đặc biệt là giảm thiểu số lần phải viết lại mã. Không chỉ thể, các framework còn đặc biệt
hữu ích với những lập trình viên ít kinh nghiệm, giúp họ có thể xây dựng các ứng dụng
mang tính chuẩn hóa hơn nhờ việc tương tác chính xác giữa việc xử lý cơ sở dữ liệu
(database), mã PHP và giao diện (HTML) một cách riêng biệt.
Các PHP framework hiện nay hầu hết đều cung cấp sẵn các module nền tảng cần thiết và
thư viện mã lệnh chuẩn (kết nối database, quản lý session, template engine…) để xây
dựng ứng dụng.
9
Ý tưởng chung đằng sau kiến trúc của một PHP Framework được kể đến là mô hình
MVC. Một mô hình không mới nhưng mang lại nhiều cảm hứng cho các chuyên gia lập
trình trong nhiều năm qua. Chúng ta sẽ cùng tìm hiểu các khái niệm và đặc điểm của mô
hình M-V-C.
1.3 MVC là gì?
MVC là chữ viết tắt của Model-View-Controller, một mẫu kiến trúc (architectural
pattern) được tạo ra nhằm giải quyết các vấn đề phát sinh cũng như các giải pháp tổ chức
mã trong quá trình phát triển phần mềm. Khi sử dụng đúng cách, mẫu MVC giúp cho
người phát triển phần mềm cô lập các nguyên tắc nghiệp vụ và giao diện người dùng một
cách rõ ràng hơn. Phần mềm phát triển theo mẫu MVC tạo nhiều thuận lợi cho việc bảo
trì vì các nguyên tắc xử lý nghiệp vụ và giao diện ít có liên quan với nhau.
1.3.1. Lịch sử MVC
Bắt đầu vào những năm 70 của thế kỷ 20, tại phòng thí nghiệm Xerox PARC ở Palo Alto.
Sự ra đời của giao diện đồ họa (Graphical User Interface) và lập trình hướng đối tượng
(Object Oriented Programming) cho phép lập trình viên làm việc với những thành phần
đồ họa như những đối tượng đồ họa có thuộc tính và phương thức riêng của nó. Không
dừng lại ở đó, những nhà nghiên cứu ở Xerox PARC còn đi xa hơn khi cho ra đời cái gọi
là kiến trúc MVC (viết tắt của Model – View – Controller). Kiến trúc MVC đã được ứng
dụng để xây dựng rất nhiều thư viện đồ họa khác nhau. Tiêu biểu là bộ thư viện đồ họa
của ngôn ngữ lập trình hướng đối tượng SmallTalk (cũng do Xerox PARC nghiên cứu và
phát triển vào thập niên 70 của thế kỷ 20). Ngày nay, trong nhiều các nền tảng lập trình
chúng ta thấy sự có mặt của mô hình MVC, có thể kể đến:
+ Swing Components của Java
+ Document View Architecture trong Microsoft Visual C++ (VC++)
+ QT4(KDE)
+ Apple’s Cocoa (Core Data)
10
1.3.2. Vai trò của các thành phần M-V-C trong Web framework
Hình 1. 0.1 Mô hình MVC
a. C - Controller
Controller là các lớp điều khiển luồng ứng dụng, tiếp nhận yêu cầu người dùng thông qua
HTTP header, sau đó chuyển tiếp nó đến các lớp phụ trách trực tiếp xử lý yêu cầu. Tùy
theo cách thiết kế lớp mà chúng ta thường thấy Controller gồm:
+ Front Controller. Là một controller xử lý tất cả các yêu cầu người dùng cho website.
Fron Controller có nhiệm vụ hợp nhất tất cả các xử lý yêu cầu vào một kênh yêu cầu
thông qua một đối tượng.
+ Dispatcher: Lớp điều phối hướng các điều khiển đi mức cao hơn
+ Request: xử lý một phần dữ liệu đầu vào ở mức GET, POST
+ Session: xử lý một phần dữ liệu đầu vào ở mức SESSION
Tùy theo dữ liệu đầu vào, Controller sẽ thực hiện các phép lọc (với dịch vụ lấy từ Model),
các tính toán lựa chọn (Action Mapping) dựa trên kiến trúc và cấu hình nhằm xác định
thành phần lớp chính sẽ thực hiện yêu cầu của người dùng. Hiểu một cách đơn giản,
Controller là thành phần trung gian giữa View và Model. Nó nhận dữ liệu nhập vào qua
View, sau đó gọi Model tương ứng rồi lấy kết quả trả về từ Model này. Tiếp theo, một
View thích hợp sẽ được lựa chọn. Controller sẽ chuyển tiếp dữ liệu vào view để nó xử lý.
Một số hoạt động thường thấy của Controller:
Tạo form, gửi tin nhắn đến form để yêu cầu kiểm tra dữ liệu
11
Tạo các dịch vụ liên quan đến nghiệp vụ ứng dụng, yêu cầu các lớp dịch vụ tương
tác với nguồn dữ liệu để trả về hay thay đổi trạng thái dữ liệu: thực hiện các thao tác
chuyển đổi dữ liệu, kiểm tra quyền truy cập trên một hoạt động cụ thể, tương tác
với database, tương tác với các web services.
Tạo đối tượng view, gán các nguồn dữ liệu lấy được từ đối tượng dịch vụ vào cho
view.
b. M - Model
Model là các lớp cung cấp dữ liệu, dịch vụ liên quan đến dữ liệu và các vấn đề xử lý logic
nghiệp vụ. Model có thể:
Đánh giá tính hợp lệ của dữ liệu.
Ví dụ kiểm tra dữ liệu vào có đúng với nguyên tắc của hệ thống không
Chuyển đổi dữ liệu. Ví dụ chuyển đổi định dạng file, chuyển đổi tỉ giá, chuyển đổi
ngôn ngữ…
Đưa ra quyết định về nghiệp vụ. Ví dụ đưa ra các dữ liệu, lời khuyên tư vấn đầu tư
dựa trên dữ liệu đầu vào của người dùng và các dữ liệu đang có
Thực hiện việc xử lý dữ liệu theo một quy trình
Do có hai vai trò tương đối tách biệt cho nên một Model thường được tách thành các lớp
có các vùng xử lý khác biệt:
Vùng xử lý Logic nghiệp vụ: thường là xử lý rule hay policy của nghiệp vụ cũng
như quy trình nghiệp vụ.
Vùng xử lý dữ liệu: Cung cấp/lưu trữ dữ liệu và việc chuyển đổi dữ liệu thành các
dạng khác nhau theo yêu cầu
Trong các tình huống đơn giản, Model chỉ làm vài thao tác đơn giản như lấy dữ liệu từ
database. Trong các tình huống phức tạp, việc xử lý có thể là tổ hợp của hàng trăm lớp
diễn ra trên một hoặc vài máy chủ (server) hoặc thậm chí dữ liệu hay quyết định được đưa
ra từ Model lại là tổng hợp kết quả từ một vài trung tâm dữ liệu nằm rải rác trên vài lục
địa. Do vậy trong Model không chỉ có các thao tác trên database và có còn là file system,
memory, networking I/O ...
Model hoạt động như là một tầng dịch vụ nhằm có thể tái sử dụng giữa các Controller.
12
Khi Controller gọi Model thông qua các giao diện lập trình (API) của Model, nó cần biết
một số ứng xử chung của Model. Ví dụ:
Cách Model đó gửi tín hiệu về quá trình nó xử lý yêu cầu. Có hay không có lỗi
ngoại lệ, kiểu của lỗi ngoại lệ, lỗi trong trường hợp nào.
Kiểu trả veef cần mang tính nhất quán
c. V - View
View là các lớp định nghĩa cách thức trình bày dữ liệu (không cập nhật dữ liệu). Trong
các web framework, View gồm hai phần chính:
Template file: định nghĩa cấu trúc và cách thức trình bày dữ liệu cho người dùng.
Ví dụ như bố cụ, màu sắc, khung nhìn ...
Phần Logic: xử lý cách áp dụng dữ liệu vào cấu trúc trình bày. Logic này có thể
bao gồm việc kiểm tra định dạng dữ liệu, chuyển đổi định dạng dữ liệu sang một
sạng dữ liệu trung gian để có thể hiển thị với cấu trúc template đang có..., kiểm tra
trạng thái và đặc tính của dữ liệu để lựa chọn một cấu trúc hiện thị phù hợp.
Bản thân View cũng là một tổ hợp của nhiều lớp. Và nó cũng có thể có View con để giảm
tải trên một số lớp chính và để sử dụng lại mã. Và do vậy tính logic của View có thể là
logic của một cây phân cấp.
Trong mô hình truyền thống, View có trách nhiệm chuyển đổi dữ liệu hay trạng thái của
Model thành cấu trúc trực quan. Do vậy dữ liệu của Model cần được định nghĩa một cách
hợp lý. Sự tách biệt của hai thành phần này sẽ giúp cho người lập trình phân định được
một biên giới rõ ràng giữa cách thức lưu trữ/lấy dữ liệu và cách trình bày dữ liệu. Do vậy
tính phức tạp của quy trình lấy dữ liệu, xử lý dữ liệu cũng như (sự thay đổi của chúng
theo thời gian) trước khi trả về sẽ không làm ảnh hưởng đến việc trình bày dữ liệu. Rõ
ràng sự khác biệt về công nghệ lấy dữ liệu và công nghệ sinh trang không gây ảnh hưởng
đến ứng dụng. Điều này khá quan trọng trong việc tích hợp các ứng dụng. Ngoài ra, cách
làm này thực sự đảm bảo việc tách biệt vai trò của người thiết kế giao diện với vai trò của
lập trình viên thiên về dữ liệu. Như vậy khi làm việc theo nhóm, người quản trị dự án có
thể tổ chức nhóm phát triển thành các nhóm kĩ năng và phát triển ứng dụng song song với
nhau.
Các công nghệ thường được sử dụng ở View là HTML, CSS và JavaScript.
13
Hình 1. 0.2 Biểu đồ tuần tự một chuỗi MVC đơn giản
Tóm lại, MVC chia trách nhiệm công việc thành ba phần riêng rẽ:
Phát triển (development): Các nhà phát triển làm việc với model. Đặc trưng của phần
này là tận dụng một cách triệt để kiến thức, kỹ năng của các lập trình viên liên quan
tới thuật toán xử lý dữ liệu, quản trị cơ sở dữ liệu...
Thiết kế (design): Các nhà thiết kế làm việc trực tiếp với lớp View, chịu trách nhiệm
tạo ra "cảm quan" cho ứng dụng. Họ cần có kinh nghiệm làm việc với HTML, CSS,
JavaScript và Graphic Design.
Hợp nhất (intergration): phần này tồn tại trong lớp Controller. Mục đích chính là gắn
kết developer và designer với nhau. Người hợp nhất không cần có nhiều kinh nghiệm
làm việc với dữ liệu như lập trình viên nhưng cần nắm rõ cách tổ chức của một ứng
dụng.
Mô hình MVC được áp dụng rất nhiều trong các Web framework hiện nay. Các PHP
framework phổ biến nhất:
Zend framework: là sản phẩm của Zend – công ty “bảo trợ” cho PHP. Với các
tính năng mạnh mẽ, Zend framework thường được sử dụng cho các công ty lớn, và
bạn cần phải có lượng kiến thức khá sâu rộng về PHP để có thể sử dụng được Zend
framework.
CakePHP: là một lựa chọn tốt cho những lập trình viên có kiến thức nâng cao về
PHP. Nó dựa trên cùng một nguyên tắc thiết kế với Ruby on Rails (một framework
dành cho các nhà phát triển các ứng dụng web bằn ngôn ngữ Rail). Với các hệ
14
thống hỗ trợ, tính đơn giản và mỗi trường mở cao đã giúp cho CakePHP trở thành
một trong những framework phổ biến nhất hiện nay.
CodeIgniter: một MVC framework viết bằng PHP4 (gần đây đã tương thích hoàn
toàn với PHP 5.3.0 trong phiên bản 1.7.2). Được biết đến như một framework dễ
hiểu và dễ sử dụng. CodeIgniter được Rasmus Lerdorf – cha đẻ của ngôn ngữ PHP
– đánh giá rất cao vì tính tinh giản về cấu trúc, đạt hiệu năng cao khi vận hành.
Không giống như Symfony, PHP framework này phục vụ mục đích lý tưởng cho
việc xây dưng các ứng dụng chia sẻ, lưu trữ. Nó cung cấp các giải pháp đơn giản,
và có một thư viện video hướng dẫn phong phú, diễn đàn hỗ trợ, và cung cấp sẵn
một hướng dẫn sử dụng cho người mới bắt đầu. PHP framework này rất phù hợp
cho một người mới làm quen với framework.
Joomla! v1.5.x: một hệ quản trị nội dung nguồn mở được phát triển theo mô hình
MVC trong các phần mở rộng (extensions), bao gồm các thành phần (components)
và các mô đun (modules).
Cảm thấy chưa thỏa mãn với mô hình hiện tại của các framework, chúng tôi đã nghiên
cứu và phát triển được một framewok hoàn toàn mới, giải quyết được mọi yêu cầu trong
các bài toàn phát triển web.
15
CHƯƠNG 2. GIỚI THIỆU FRAMEWORK ĐÃ XÂY DỰNG
2.1. Tổng quan về framework đã xây dựng
Sau một quá trình tìm tòi và phát triển, chúng tôi đã xây dựng được một PHP framework
hoàn toàn mới, có nhiều ưu điểm so với các framework hiện nay. Chúng tôi đặt tên
framework này là Hiphop framework.
Hiphop framework là một PHP5 framework được viết ra nhằm mục đích tận dụng mọi ưu
điểm của mô hình MVC trong việc xây dựng các ứng dụng web động bằng ngôn ngữ
PHP. Hiphop giúp các lập trình viên tạo nên các ứng dụng web có kiến trúc sáng sủa, dễ
bảo trì và dễ mở rộng. Bên cạnh đó, Hiphop cho phép các nhà phát triển xây dựng một
ứng dụng web nhanh hơn rất nhiều so với việc viết mã thuần túy bằng cách cung cấp một
bộ thư viện đầy đủ cho các tác vụ thông thường, cũng như cung cấp một mô hình tương
tác đơn giản và dễ hiểu cho việc kết nối tới những bộ thư viện đó.
Hiphop mang theo một triết lý riêng về tổ chức ứng dụng web từ mô hình MVC cho đến
kiến trúc phân cấp Controller. Vì thế, Hiphop mang theo nhiều điểm khác biệt so với các
PHP framework đương đại.
Hình 2. 0.1 Mô hình MVC được áp dụng trong Hiphop framework
16
Các đặc điểm nổi bật của Hiphop framework bao gồm:
Tính dễ sử dụng (với cả các lập trình viên chưa có nhiều kinh nghiệm)
Kiến trúc MVC hiện đại: mô hình dữ liệu (Model), điều khiển ứng dụng
(Controller), chức năng hiển thị (View)
Khả năng tổ chức ứng dụng thành các lớp Controller đa tầng, giúp ứng dụng có tính
module hóa
Tốc độ xử lý rất nhanh so với các PHP Framework đương đại nhờ kiến trúc khá
thông minh và mã được tinh giản, tối ưu cao
Hệ thống lớp truy xuất Database mạnh mẽ, hỗ trợ tạo nhiều kết nối Database đến các
máy chủ database khác nhau trên cùng một request.
Thư viện hỗ trợ caching
Mềm dẻo trong việc định tuyến URL (URL Routing)
Ngoài ra, Hiphop framework tích hợp thêm vào một số lớp thư viện mà các framework
khác chưa mặc định tích hợp:
Gửi Email, hỗ trợ đính kèm, HTML/Text email, đa giao thức (sendmail, SMTP, and
Mail) – Email Class
Thư viện chỉnh sửa ảnh (cắt ảnh, thay đổi kích thước, xoay ảnh, v.v..) – Image
Class
Đăng tải một file lên server – Upload Class
Tương tác với máy chủ thông qua giao thức FTP - FTP Class
Phân trang tự động – Pagination Class
Nén file - Zip Encoding Class
Tạo ảnh Captcha - một loại kiểm thử dạng hỏi đáp được dùng trong máy tính để xác
định xem người dùng có phải là con người hay không - Captcha Class
Một lượng lớn các hàm hỗ trợ (helpers)
Bên cạnh đó là thư viện hàm hỗ trợ (helper) phong phú đi kèm.
Yêu cầu hệ thống khi sử dụng Hiphop framework:
17
Để hệ thống vận hành được, yêu cầu tối thiểu sau cần được đáp ứng:
Web server: Apache, Nginx, Lighttpd
PHP 5.2.6 trở lên
Database (tùy chọn): MySQL (4.1+), MySQLi
Khuyến cáo:
Web server: Apache 2.2.11 kết hợp với PHP như là một module
PHP 5.2.6 trở lên có bật APC
18
2.2. Kiến trúc của Hiphop framework
2.2.1 Tổng quát về hệ thống thư mục trong Hiphop framework
Hình 2. 0.2 Cấu trúc cây thư mục Hiphop framework
Application Nơi lưu trữ ứng dụng của bạn. Chia làm ba thư mục con:
Controller: chứa các Controller của ứng dụng
19
Model: chứa các Model của ứng dụng
View: chứa các View của ứng dụng
Config Chứa các file cấu hình hệ thống, gồm các thư mục:
Autoload: liệt kê các helper, library, model tự động load khi
ứng dụng khởi động
Database: cầu hình để kết nối với các database
Helper Nơi lưu trữ các hàm hỗ trợ lập trình tối ưu
Libraries Chứa các thư viện hỗ trợ xử lý các vấn đề nghiệp vụ
Hiphop Chứa các lớp và hàm cốt lõi của Hiphop
Database Chứa các lớp xử lý truy xuất tới các hệ quản trị cơ sử dữ liệu khác
nhau
2.2.2 Các thành phần cốt lõi
Trước hết ta cần tìm hiểu quy trình xử lý một HTTP request của ứng dụng viết bởi PHP
framework. Biểu đồ sau minh họa điều đó.
Hình 2. 0.3 Quy trình xử lý một HTTP request - Hiphop framework
Bước 1. File index.php được dùng như một front controller, có nhiệm vụ khởi tạo các tài
nguyên cơ bản cần thiết cho việc chạy Hiphop framework.
Bước 2. Lớp Router kiểm tra HTTP requsest để xác nhận những việc phải làm.
Bước 3. Nếu file đệm (cache file) tồn tại, nó gửi trực tiếp nội dung cache file đó tới trình
duyệt. Nếu không, Controller phù hợp với yêu cầu sẽ được gọi tiếp theo sau đó.
20
Bước 4. Các Controller nạp vào các model, các thư viện lõi (library), các hàm sử dụng và
bất kỳ tài nguyên khác cần cho việc xử lý một yêu cầu cụ thể.
Bước 5. Cuối cùng thành phần View được tạo ra và được gửi trực tiếp tới trình duyệt.
Hình 2. 0.4 Mô phỏng cấu trúc các thành phần cốt lõi trong Hiphop framework
Các thành phần cốt lõi tạo nên Hiphop framework:
a. File index.php
21
Là file đầu tiên được gọi khi một yêu cầu người dùng được gửi tới hệ thống. Nhiệm vụ
của file này là đọc giá trị biến route từ chuỗi truy vấn (query string), khởi tạo các lớp cơ
sở (Input, Output, Route, Registry). Sau đó gọi hàm call_user_func_array() trong PHP
để chạy các hàm, lớp tương ứng với giá trị biến route. Sau cùng là hàm $output-
>display() trả về cho trình duyệt chuỗi HTML do các View cung cấp (được gọi từ
Controller).
b. Class Input (system/libraries/Input.php)
Là lớp được khởi tạo mặc định trong file index.php. Lớp này cung cấp các hàm hỗ trợ
việc lấy các input data: $_GET, $_POST, $_SERVER….
c. Class Registry (system/hiphop/Registry.php)
Là một final class Registry được tạo ra nhằm quản lý toàn bộ các đối tượng đã được khởi
tạo từ các lớp cơ bản (Input, Output, DB,…). Registry class tận dụng kĩ thuật lập trình
hướng đối tượng để đảm bảo việc tạo đối tượng chỉ diễn ra một lần trong toàn bộ chu kì
sống của một yêu cầu (request).
Hình 2. 0.5 Lớp Registry
d. Router object (khởi tạo từ class Router trong system/libraries/Router.php)
Router là một đối tượng được khởi tạo khi Hiphop vận hành nhằm chuyển tiếp cấu trúc
request dạng mảng $_GET do URL resolver sinh ra đến một lớp Controller. Nó có vai trò
trung gian trong việc tiếp nhận thành phần request được chuẩn hóa từ URL resolver, phân
tích đặc tả quy ước, tìm kiếm lớp Controller có thể xử lý request và các thao tác xử lý
khác liên quan đến việc này.
22
Hình 2. 0.6 Lớp Router
e. Output object (khởi tạo từ class Output trong system/libraries/Output.php)
Cũng là đối tượng được khởi tạo trong index.php với mục đích cập nhật luồng dữ liệu
HTML được tạo ra từ các View.
Hình 2. 0.7 Lớp Output
f. Loader object (khởi tạo từ class Loader trong system/libraries/Loader.php)
Đóng vai trò là một biến của lớp Controller.
Hình 2. 0.8 Lớp Loader
function view() Ghi nhận chuỗi HTML do View trả lại vào biến $output
function helper() Nạp các thư viện hàm hỗ trợ (helpers) được yêu cầu
function library() Nạp và khởi tạo các lớp thư viện được yêu cầu
function model() Tạo đối tượng từ lớp Model được yêu cầu
23
function database()
Khởi tạo kết nối tới database (Cấu hình kết nối tới các
database được thiết đặt trong file
system/config/database.php)
g. class Controller (system/libraries/Controller.php)
Là lớp Controller cơ sở, làm nên sự khác biệt về mặt tổ chức code của ứng dụng trên
Hiphop framework so với các framework khác. Controller dùng các magic method (một
khái niệm về các phương thức đặc biệt trong PHP) như __set, __get để quản lý các biến
trong chính controller do lập trình viên tạo ra.
Hình 2. 0.9 Lớp Controller
Mọi lớp Controller trong ứng dụng của bạn đều phải thừa kế từ lớp Controller cơ sở.
h. Database (system/libraries/Database.php)
Database là phần PHP giao tiếp tốt nhất. Các hệ quản trị cơ sở dữ liệu mở mạnh mẽ và
phong phú: OCI (Oracle đóng góp), DB2 (IBM đóng góp), libmysql (MySQL AB đóng
góp), pgsql do cộng đồng PostgreSQL đóng góp và luôn hỗ trợ các bản database mới
nhất. Ngoài ra PHP có sẵn một database server SQLite nhúng đi kèm với mọi bản PHP
5.0+ có thể giúp các lập trình viên tiện trong việc xử lý các nhóm data nhỏ nhưng đủ
mạnh mẽ như Microsoft Access.
Hiphop framework cung cấp một thư viện giao tiếp với MySql - hệ quản trị cơ sở dữ liệu
mã nguồn mở phổ biến nhất thế giới và được các nhà phát triển rất ưa chuộng khi lựa
chọn giải pháp lưu trữ thông tin. Thư viện này không chỉ giúp tiết kiệm được thời gian khi
lập trình viên làm việc với hệ thống database mà còn giúp lập trình viên tránh được các
lỗi báo mật (SQL Injection) khi viết câu lệnh SQL.
i. Các thư viện – Library (các class đặt trong thư mục system/libraries)
24
Hiphop cung cấp một tập hợp các thư viện hỗ trợ lập trình đa dạng, giúp các lập trình viên
xây dựng ứng dụng web nhanh và hiệu quả hơn. Mỗi thư viện thực chất là một PHP class
chứa nhiều các phương thức trong nó, và cũng có thể được gọi như những lớp Model.
$this->load->library('name_library', 'alias');
$this->alias->function();
Chúng ta sẽ tìm hiểu cụ thể các lớp thư viện trong Hiphop framework vào Chương IV.
k. Các hàm trợ giúp – Helper (đặt trong thư mục system/helpers)
Không giống với Library, Helper không phải là một class hướng đối tượng, chỉ là một file
chứa một hoặc nhiều hàm cùng tập trung hỗ trợ một nhiệm vụ cụ thể trong quá trình xây
dựng ứng dụng. Ví dụ: Cookie Helper là chứa một tập hợp các hàm xử lý các vấn đề liên
quan tới cookie (thiết đặt/sửa/xóa cookie).
Load một helper từ controller:
$this->load->helper('name');
Sau khi được load, có thể dùng ngay các hàm có trong Helper ở bất cứ đâu. Ví dụ:
Trong chương IV, chúng ta sẽ tìm hiểu các lớp thư viện và hệ thống các hàm helper
phong phú được tích hợp trong Hiphop framework.
25
CHƯƠNG 3. CÁC KHÁI NIỆM BAN ĐẦU KHI XÂY
DỰNG ỨNG DỤNG WEB BẰNG HIPHOP FRAMEWORK
3.1. Hiphop URLs
Hiphop framework nhìn website như một tập các trang web rời rạc, gắn kết với nhau qua
URL và hệ thống thư viện mức code. URLs trong Hiphop framework được thiết kế nhằm
mục đích thân thiện cả cho người và các bộ máy tìm kiếm.
Hình 3. 0.1 Ví dụ một URL Hiphop framework:
Giá trị của biến route được truyền qua chuỗi truy vấn (query string) được coi như dữ liệu
vào, Hiphop framework dùng giá trị này để xác định Controller nào sẽ được gọi để thực
hiện yêu cầu của người dùng. Giá trị của route là một chuỗi các segment, nối với nhau
bởi dấu “/”
Segment đầu tiên tượng trưng cho lớp (class) Controller sẽ được gọi
Segment thứ hai tượng trưng cho hàm (function) trong lớp Controller tương ứng
Segment thứ ba (tùy chọn) chỉ ra giá trị của tham số (param) được truyền tới hàm này
Ví dụ:
yousite.com/index.php?route= blog/detail/123
Khi nhận được URL này từ trình duyệt, Hiphop sẽ khởi tạo một đối tượng từ class Blog
(trong Controller) và thực hiện phương thức detail trong class này với tham số 123
Hiphop framework nhìn nhận một trang web là tập hợp các thành phần HTML ghép nối
với nhau, mỗi thành phần HTML lại được hợp thành từ nhiều thành phần HTML con.
Mỗi thành phần HTML được gọi là View. Một View chỉ có thể được gọi từ một
Controller tương ứng với nó.
3.2. Các lớp Controller
Các controller đóng vai trò mấu chốt trong những ứng dụng xây dựng bằng Hiphop
framework. Controller được khai báo như là một PHP class bình thường, mở rộng
(extends) từ lớp Controller cơ sở trong Hiphop. Tên của Controller class luôn phải trùng
26
với tên file chứa nó và viết hoa chữ cái đầu tiên. Ví dụ: file header.php chứa class
Header.
Trong Hiphop framework, các lớp controller được phân chia làm hai loại: controller gốc
và controller con (cấp 1, 2…) tùy theo cấp của các thành phần View mà các lớp
Controller gọi tới.
- Controller gốc: được đặt tên dựa theo các URL, các phương thức bên trong
controller gốc tạo ra tùy thuộc vào yêu cầu gửi từ mỗi URL. Một lớp Controller gốc
thường chứa nhiều method và đó chính là điểm vào chương trình và là nơi HTML
page được sinh ra. Một controller gốc có thể chứa nhiều con là controller con cấp 1.
- Controller con: là một controller, chỉ có thể được gọi từ controller mức trên của
mình mà không thể gọi trực tiếp qua URL. Controller con có nhiệm vụ chính là trả về
cho controller cha thành phần View do chính controller này đảm nhiệm thông qua các
dịch vụ lấy từ Model. Để khai báo các “con” của mình, controller cần khai báo một
mảng gồm danh sách tên các controller con thông qua biến $this->children.
Controller con chỉ chứa duy nhất một hàm có tên index().
Ví dụ về cây phân cấp controller một trang web trong Hiphop:
Controller gốc
Controller cấp 1 Controller cấp 2 Controller cấp 3
Controller cấp 2 Controller cấp 3
27
Hình 3. 0.2 Minh họa Sơ đồ phân cấp controller trang chủ
3.3. View - Template
View đơn giản là một trang web hoặc một thành phần nhỏ trên trang (VD: header, footer,
sidebar…) được định nghĩa bằng các file php chứa mã HTML và các biến logic, đặt trong
thư mục application/views/. View không bao giờ được gọi một cách trực tiếp mà phải
được gọi qua một Controller cụ thể. Mỗi controller “sở hữu” một view riêng biệt bằng
cách khai báo biến $this->template trong nó.
Xét một ví dụ đơn giản để hiểu hơn về các khái niệm controller, view trong Hiphop
framework.
Khi người dùng gõ vào thanh địa chỉ (address bar) của trình duyệt để tải về trang web có
URL:
yoursite.com/index.php?route=blog/
Hiphop sẽ tìm tới file controller được đặt tên blog.php và nạp file này.
Chúng ta sẽ tìm hiểu cách thức tạo ra một lớp Controller thực sự trong một ứng dụng. Sử
dụng một text editor, tạo file có tên blog.php có nội dung như sau và đặt vào thư mục
application/controllers/
class Blog extends Controller {
function __construct() {
parent::__construct();
}
function index() {
$this->data = array('message' => 'Welcome to My Blog');
28
$this->template = "blogview";
$this->children = array("header");
$this->render(TRUE);
}
}
Trong ví dụ trên, controller gốc là Blog, controller con cấp một là Header được khai báo
trong mảng $this->children().
Biến $this->children(): Khai báo các Controller con của Controller hiện tại
Biến $this->template(): Khai báo đường dẫn file View, chỉ ra template
(view) của controller hiện tại. Trong mỗi controller việc khai báo template là điều
bắt buộc.
Biến $this–>data: là biến kiểu array, được truyền tới blogview để hiển thị sau
khi gọi hàm $this–>render(TRUE) trong phương thức index.
Lời gọi hàm $this–>render(TRUE): Là lời gọi bắt buộc phải có trong mỗi
phương thức của controller. Tham số đi kèm là TRUE nếu controller này là
controller gốc, là FALSE nếu controller là controller con. Dòng này thực thi các
code PHP có trên view và trả lại một string chứa mã HTML cho toàn bộ trang
nhưng không in chúng ra, thay vào đó, giá trị này được truyền vào biến $output
khởi tạo từ class Output, một lớp có chức năng xử lý giao thức HTTP và trả lại
cho trình duyệt. $this->render(params) luôn là dòng được viết cuối cùng
trong phương thức.
Đây là các ràng buộc mà các lập trình viên phải tuân thủ khi xây dựng các ứng dụng để
Hiphop framework hiểu và hỗ trợ.
Như đã nói ở trên, Segment thứ hai của URL chỉ ra phương thức nào trong Controller gốc
sẽ được thực hiện. Khi Segment thứ hai trống, mặc định Hiphop sẽ thực hiện toàn bộ các
dòng code nằm bên trong phương thức index(). Các method này chỉ là nơi điều phối các
lớp khác để sinh ra HTML chứ không trả về HTML một cách trực tiếp cho trình duyệt
thông qua giao thức HTTP.
Trở lại ví dụ trên, hãy tạo một file có tên blogview.php có nội dung như sau và đặt vào
thư mục application/views/. Đây chính là thành phần View của Blog controller.
29
Tiếp theo, tạo Header controller (controller con) bằng cách tạo file header.php có nội
dung như sau, đặt vào thư mục application/controller/
class Header extends Controller {
function __construct() {
parent::__construct();
}
function index() {
$this->id = 'header';
$this->data['title'] = 'Demo Blog';
$this->template = "header_view";
$this->render(FALSE);
}
Biến $this->id là thành phần bắt buộc phải khai báo trong mỗi Controller con, giá trị của
biến $this->id sẽ được dùng làm tên biến truyền vào thành phần View của Controller cha,
biến này chứa toàn bộ mã HTML do view của controller đó sinh ra. Nhìn vào dòng đầu
tiên của blogview.php ta sẽ thấy biến $header được echo, đây chính là View của Header
controller.
Hình 3. 0.3 blogview.php Hình 3. 0.4 header.php
header_view - view của Header controller được đặt trong thư mục application/view/:
30
Bây giờ, mở lại URL ban đầu bằng trình duyệt. Kết quả trên màn hình là trang web có
title “Demo Blog” cùng dòng chữ: “Welcome to My Blog”
3.4. Các lớp Model
Các lớp Model là các PHP class thừa kế từ lớp Model cơ sở của Hiphop framework, được
thiết kế với mục đích chính là xử lý các thông tin trong database. Ví dụ, để quản lý một
Blog, bạn cần có một lớp model chứa các hàm làm các nhiệm vụ như: thêm, sửa, xóa hoặc
đọc các dữ liệu bài viết.
class Blog_model extends Model {
function __construct()
{
parent::__construct();
}
function getTenEntries()
{
$query = $this->db->query('SECLECT * FROM entry LIMIT 10, 0');
return $query->result_array();
}
function insertEntry()
{
$this->db->query(“INSERT INTO entry VALUE {$_POST['title']}”s);
}
}
Các model được đặt trong thư mục application/model/. Có thể đặt vào các thư mục con
trong của application/model/. Nguyên mẫu cơ bản của một lớp Model:
31
class Model_name extends Model {
function __construct()
{
parent::__construct();
}
}
Tên file chứa class này có dạng: model_name.php, trùng với tên class Model. Chú ý
rằng, tên của class Model bắt buộc phải viết hoa chữ cái đầu tiên.
Các class Model được nạp và gọi từ các phương thức trong lớp Controller. Để làm được
điều này, trong phương thức của Controller phải có hàm:
$this->load->model('Sub_folder/Model_name', 'name_object');
Tham số thứ hai định nghĩa tên của đối tượng được khởi tạo từ class Model_name. Nếu
không có tham số thứ 2, tên của đối tượng này sẽ được Hiphop framework đặt trùng với
tên của class Model. Chúng ta có thể truy cập tới các phương thức của lớp Model một
cách dễ dàng sau khi đã load Model:
$this->load->model('Model_name', 'name');
$this->name->functionInModel();
Dưới đây là ví dụ về một lớp controller, lấy dữ liệu từ Model và truyền vào View
class Blog extends Controller {
function index()
{
$this->load->model('Blog_model');
$this->data['entries'] = $this->Blog_model->getNewsEntries();
$this->template = 'blog_view';
$this->render(TRUE);
}
}
32
CHƯƠNG 4: HỆ THỐNG CÁC LỚP THƯ VIỆN
VÀ HÀM HỖ TRỢ - LIBRARY & HELPER
Hệ thống lớp thư viện và hàm hỗ trợ trong Hiphop giúp các lập trình viên thao tác trong
việc xây dựng ứng dụng của mình nhanh và hiệu quả hơn. Chương này giới thiệu đầy đủ
các lớp thư viện (library) và các hàm trợ giúp trong Hiphop cũng như cách thức sử dụng
chúng trong quá trình xây dựng ứng dụng.
4.1 Các lớp thư viện
4.1.1. Email library
Là công cụ mạnh mẽ giúp đơn giản hóa việc gửi email. Lớp thư viện Email hỗ trợ các tính
năng sau đây:
Hỗ trợ đa giao thức: Mail, Sendmail và SMTP
CC and BCCs
Email dạng chữ (text) hoặc HTML
Hỗ trợ gửi file đính kèm
Sau đây là ví dụ minh họa việc gửi mail trong Hiphop dễ dàng thế nào.
$this->load->library('email');
//Cấu hình việc gửi email
$config['protocol'] = 'sendmail';
$config['mailpath'] = '/usr/sbin/sendmail';
$config['charset'] = 'iso-8859-1';
$config['wordwrap'] = TRUE;
$this->email->initialize($config);
$this->email->setFrom('your@example.com', 'Your Name');
$this->email->setTo('someone@example.com');
$this->email->setCC('cc@example-mail-box.com');
$this->email->setBCC('bcc@ example-mail-box.com');
$this->email->setSubject('Testing email class');
33
$this->email->setMessage('Testing the email class.');
$this->email->send();
Với trường hợp gửi tới nhiều địa chỉ mail, chỉ cần làm như đoạn code sau:
$list = array('one@example.com', 'two@example.com', 'three@example.com');
$this->email->to($list);
Hàm $this->email->attach() giúp gửi file đính kèm. Đặt đường dẫn file đính kèm trong
tham số đầu tiên của hàm:
$this->email->attach('/path/to/photo1.jpg');
$this->email->attach('/path/to/photo2.jpg');
$this->email->attach('/path/to/photo3.jpg');
$this->email->send();
4.1.2. Database library
Trước khi làm việc với thư viện này, cần thiết đặt các thông số kết nối như username,
password, tên database trong file system/config/database.php theo mẫu sau:
$currentConnection = 'default';
$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "";
$db['default']['database'] = "database_name_1";
$db['default']['dbdriver'] = "mysql";
Lý do mảng $db phải ở dạng hai chiều có liên quan tới tính năng hỗ trợ nhiều kết nối tới
nhiều cơ sở dữ liệu của Hiphop framework. Ví dụ, trong ứng dụng của bạn cần tới một kết
nối tới database khác, chỉ cần thêm thiết đặt sau vào file database.php bên trên:
$db['test']['hostname'] = "localhost";
$db['test']['username'] = "root";
$db['test']['password'] = "";
$db['test']['database'] = "database_name_2";
$db['test']['dbdriver'] = "mysql";
“Test” là một tên ngẫu nhiên ta đặt cho kết nối thứ hai. Tương tự chúng ta có thể định
nghĩa các kết nối khác một cách dễ dàng.
Theo mặc định, sau khi câu lệnh:
$this->load->database();
được thưc hiện, kết nối default sẽ mặc định được nạp vào controller (cụ thể là biến
$this->db trong Controller).
34
Sau khi nạp một kết nối database, chúng ta có thể dùng được các phương thức trong lớp
Database để tương tác với database qua kết nối này.
a. escape()
Tự động thêm ký tự nháy đơn (‘) cho tham số trong hàm. Hàm này đặc biệt hữu ích
trong việc viết các câu truy vấn an toàn nhằm tránh lỗi SQL Injection.
$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
b. query()
$query = $this->db->query('YOUR QUERY’);
Hàm query() trả về một đối tượng kết quả database. Khi câu lệnh Query có kiểu
“Đọc” (SELECT), nó trả về một đối tượng và khi đó chúng ta có thể dùng các hàm
result_array(), num_rows()… dưới đây. Khi câu lệnh query là kiểu “Ghi”
(UPDATE, DELETE, INSERT), nó trả về TRUE hoặc FALSE tương ứng với
trạng thái thành công hay thất bị của câu truy vấn.
c.result_array
Trả về kết quả truy vấn dưới dạng mảng, mảng rỗng khi không có kết quả nào được tìm
thấy trong câu truy vấn. Hàm này thường được sử dụng trong các câu lệnh lặp:
$query = $this->db->query("YOUR QUERY");
foreach ($query->result_array as $row)
{
echo $row['title'];
echo $row['name'];
echo $row['body'];
}
d.num_rows
Hàm này trả lại số dòng của kết quả câu truy vấn
$query = $this->db->query('SELECT * FROM my_table');
echo $query->num_rows;
e.row($param)
35
Hàm này trả về một hàng kết quả của câu truy vấn. Tham số trong hàm chỉ ra thứ tự của
hàng được lấy, nếu hàm không chứa tham số, mặc định hàng đầu tiên của truy vấn sẽ
được trả về.
$query = $this->db->query("YOUR QUERY");
if ($query->num_rows() > 0)
{
$row = $query->row();
echo $row['title'];
echo $row['name'];
echo $row['body'];
}
4.1.3. Phân trang với Pagination class
« First Last »
Giả sử bạn muốn tạo các liên kết để chuyển hướng trang của bạn sang một trang khác như
trên, chỉ cần làm theo ví dụ sau:
$page = $this->get['page'];
$this->load->library('pagination');
$config['total’] = '200';
$config['limit'] = '20';
$config['page'] = $page;
$config[‘style_links’] = ‘css_class_links’;
$config['$style_results'] = 'css_class_results';
$config['url'] = site_url('home/listEntry&page=%s’);
//Khởi tạo các giá trị thiết đặt để tạo link phân trang
$this->pagination->initialize($config);
echo $this->pagination->createNavigation();
4.1.4 Quản lý session của PHP với session class
Để sử dụng được thư viện này, cần nạp vào controller bằng đoạn mã sau:
$this->load->library(‘session’);
Dùng các hàm set(), get() để tạo session và lấy các giá trị của session:
$this->session->set(‘name_session_1’, ‘gia_tri_session_1’);
36
$this->session->set(‘name_session_1’, ‘gia_tri_session_1’);
4.1.5 Tạo ảnh Captcha ngặn chặn các chương trình tự động
Để sử dụng, cần nạp thư viện này vào Controller bằng đoạn mã sau:
$this->load->library(‘captcha’);
Các hàm có thể sử dụng:
a. getCode()
Khi thư viện captcha được nạp, nó sẽ tự động sinh ra một chuỗi ký tự ngẫu nhiên. Bạn
dùng hàm này để lấy chuỗi ngẫu nhiên đó, phục vụ cho mục đích kiểm tra chuỗi số
nhập vào của người dùng có có trùng với chuỗi ngẫu nhiên dc sinh ra hay không.
$this->session->set('captcha') = $this->captcha->getCode();
b. showImage()
Hiển thị ảnh captcha cho người dùng:
$this->captcha->showImage();
4.1.6 Tải file lên server với Upload class
Việc upload file trên server thực sự dễ dàng với thư viện upload của Hiphop framework.
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '1000';
$config['max_width'] = '800';
$config['max_height'] = '600';
$this->load->library('upload', $config);
$this->upload->do_upload();
Để lấy các thông tin trả về của file đã upload, chỉ cần gọi hàm:
$this->upload->data();
Những thông tin này ở dạng mảng (array), bao gồm các thông tin như ví dụ sau:
Array
37
(
[file_name] => your_pic.jpg
[file_type] => image/jpeg
[file_path] => /path/to/your/upload/
[orig_name] => mypic.jpg
[file_extension] => .jpg
[file_size] => 22.2
[image_width] => 800
[image_height] => 600
[image_type] => jpeg
)
4.1.7 Tải file với giao thức FTP - FTP class
Như cách sử dụng các thư viện thông thường, để sử dụng được FTP class, bạn cần thêm
hàm sau trong Controller:
$this->load->library(‘ftp’);
Sau khi được nạp, biến $this->ftp sẽ chứa toàn bộ đối tượng FTP được khởi tạo từ
FTP class. Các hàm sẵn có:
a. $this->ftp->connect()
Kết nối và đăng nhập vào server với các thông tin đăng nhập. Hàm này phải được
dùng đầu tiên khi muốn làm việc với server qua giao thức FTP
$config['hostname'] = 'ftp.example.com';
$config['username'] = 'your-username';
$config['password'] = 'your-password';
$config['port'] = 21;
$config['passive'] = FALSE;
$config['debug'] = TRUE;
$this->ftp->connect($config);
b. $this->ftp->chmod()
Thiết đặt quyền hạn cho file hoặc thư mục trên server. Ví dụ:
$this->ftp->chmod(‘/public_html/’, 777);
c. $this->ftp->list_files()
38
Liệt kê danh sách các file hiện có trong thư mục trên server. Ví dụ:
$list = $this->ftp->list_files('/public_html/');
d. $this->ftp->close()
Đóng kết nối tới máy chủ, sử dụng khi hoàn thành các công việc cần làm với kết nối
FTP vừa tạo.
4.2 Các Helper
4.2.1. Array Helper
Nằm trong file system/helpers/array_helper.php
Bao gồm các hàm có chức năng hỗ trợ làm việc, xử lý mảng.
Để sử dụng được các hàm trong file này, cần dòng khai báo sau trong Controller:
$this->load->helper(‘array’);
Các hàm có thể sử dụng:
a. element()
Cho phép nạp thêm phần tử vào mảng, hàm này kiểm tra xem có chỉ số mảng này ko và
giá trị tương ứng của nó. Nếu một giá trị tồn tại thì trả lại giá trị đó, nếu giá trị ko tồn tại
thì trả lại giá trị false, bất kể bạn có xác định các giá trị mặc định qua ba biến.
Ví dụ:
$array = array('color' => 'red', 'shape' => 'round', 'size' => '');
echo element('color', $array); // returns "red"
echo element('size', $array, NULL); // returns NULL
b.random_element()
Trả về giá trị ngẫu nhiên của một mảng.
$ran = array(‘1’, ‘2’, ‘4’);
echo random_element($ran);
4.2.2. Text Helper
Bao gồm các hàm hỗ trợ làm việc với text
39
Sử dụng lệnh sau trong Controller để load Text Helper:
$this->load->helper(‘text’);
Các hàm có thể sử dụng:
a. word_cutter()
Cắt xén một xâu ra các từ với độ dài mong muốn
Ví dụ:
$string = "UET is the only Vietnamese university having one among the
best 100 students";
$string = word_cutter($string, 4);
// Returns: UET is the only…
Tham số thứ ba là hậu tố thêm vào string, mặc định là dấu(3 chấm) …
b. character_cutter()
Cắt xâu thành các ký tự có độ dài xác định. Hàm này luôn đảm bảo sự toàn vẹn của các từ
nên có thể số ký tự của xâu kết quả có thể sai số không đáng kể.
Ví dụ:
$string = "UET is the only Vietnamese university having one among the
best 100 students";
$string = character_cutter($string, 20);
// Returns: UET is the only Vietnamese …
Tham số thứ ba là hậu tố thêm vào xâu, nếu không khai báo thì helper mặc định là dấu …
c. highlight_code()
Tô màu xâu ký tự.
$tring = highlight_code($string);
Hàm này sử dụng hàm highlight_string() của PHP, vì thế màu được sử dụng được xác
định trong file php.ini
d. highlight_phrase()
Sẽ highlight một cụm từ trong một xâu text, tham số đầu tiên xác định string, tham số thứ
hai là cụm muốn highlight, tham số thứ ba và tham số thứ tư là thẻ html mở và đóng màu
bạn muốn.
40
e .create_slug()
Khi dùng hàm này với tham số là một chuỗi string, một chuỗi mới được sinh ra, nối với
nhau bởi dấu “-”.
$title = "Cộng hòa xã hội chủ nghĩa Việt Nam?";
$url_title = url_title($title);
// Kết quả: cong-hoa-xa-hoi-chu-nghia-viet-nam
Hàm này rất hữu ích trong việc tạo các URL thân thiện với bộ máy tìm kiếm. Chẳng hạn:
4.2.3. URL helper
Bao gồm các hàm hỗ trợ làm việc với url
a. site_url()
Ví dụ
$this->load->helper('url');
echo site_url("blog/entry/123");
$segments = array(blog, entry, '123');
echo site_url($segments);
Cả hai cách làm trên đều đưa ra kết quả là url:
yoursite.com/index.php?route=blog/entry/123
b. uri_string()
Khi dùng hàm này ở bất kỳ trang nào trong ứng dụng, kết quả chúng ta nhận được sẽ là
một chuỗi segment của trang hiện tại. Với url:
Hàm sẽ trả về chuỗi: blog/entry/123
c.get_segment($order)
Trả về segment ứng với thứ tự trong tham số $order của URL hiện tại.
Hàm get_segment(2) trả về chuỗi: entry
41
CHƯƠNG 5: ÁP DỤNG HIPHOP FRAMEWORK XÂY
DỰNG TRANG BLOG CÁ NHÂN
Yêu cầu: Xây dựng một trang blog cá nhân có các chức năng, thiết kế, giao diện như hình
vẽ. Nội dung và tiêu đề bài viết được lấy trong database.
Hình 5. 0.1Giao diện Blog
Bước 1. Xác định URL.
Url có thể có dạng:
42
yourblog.com/index.php?route=home/index
Bước 2. Xác định các phân cấp Controller.
Bằng cách nhìn nhận một trang web thành các thành phần riêng rẽ, ta có thể xác định cây
phân cấp Controller trong ví dụ này, từ đó xây dựng các Controller class cho hợp lý.
Controller gốc: Home (hàm có hàm index)
Controller cấp 1: Header, Right_Bar, Footer
Controller cấp 2: Menu (con của Header), MostViewBox và ContactBox (con
của RightBar)
Tương ứng với các controller này là view (template) tương ứng của chúng.
Bước 3: Xác định các Model
Controller Home cần liệt kê danh sách các bài viết lấy từ database và hiển thị trên
trang chủ. Ta cần một model để đảm nhiệm việc truy xuất dữ liệu trong database.
Model này cần có các phương thức sau để đáp ứng phù hợp với yêu cầu được gửi tới
từ Controller.
getLastestEntry(): lấy danh sách 10 entry mới nhất, trả về Controller
Home
getMostViewEntry(): lấy danh sách các bài được xem nhiều nhất, trả về
cho Controller con MostViewBox.
Bước 4: Viết mã
Home
Header Footer RightBar
Menu MostViewBox ContactBox
43
Như đã nói ở trên, mọi class liên quan tới ứng dụng do lập trình viên triển khai phải được
đặt trong thư mục system/application. Các lớp Controller, Model, View cần đặt vào các
thư mục tương ứng.
Ví dụ về việc viết mã cho lớp Home Controller:
class Home extends Controller {
function __construct() {
parent::__construct();
}
function index() {
$this->children = array("header",’footer’, right_bar);
$this->load->model('home_model', 'homeModel');
$this->data[‘entries’] = $this->homeModel-> getLastestEntry();
$this->template = "home_view”;
$this->render(TRUE);
}
}
View cho Controller:
44
Tương tự ta có thể phát triển tiếp các controller con khác.
Kết quả cuối cùng: Site blog cá nhân được tạo trong thời gian 30 phút (không kể thời
gian thiết kế HTML) với các đặc điểm:
Tốc độ tải trang nhanh
Mã được đặt vào thư mục con trong system/application, trong tương lai có thể dễ dàng
thêm các tính năng nâng cao để làm blog thêm phong phú.
45
KẾT LUẬN
Nội dung của khóa luận đã trình bày về khái niệm Web framework, mô tả chi tiết chức
năng các thành phần trong mô hình MVC trong các Web framework.
Kết quả chính của khóa luận là:
1- Hiểu rõ khái niệm Web application framework. Nắm rõ được mô hình MVC và vai
trò của các thành phần trong các Web framework hiện nay
2- Từ mô hình MVC chúng tôi xây dựng được một framework viết bằng PHP hoàn
toàn mới (có nhiều ưu điểm so với các PHP Framework khác) – được đặt tên là
Hiphop framework. Qua khóa luận này giới thiệu cách thức sử dụng và vận hành của
một ứng dụng được viết bằng Hiphop framework
Hướng nghiên cứu tiếp theo sẽ là đánh giá lại mã nguồn Hiphop framework, về tốc độ
thực thi và mức độ áp dụng các công nghệ mới của PHP5. Bên cạnh đó, triển khai xây
dựng thêm nhiều lớp thư viện và và hàm hỗ trợ nhằm cung cấp cho các lập trình viên
công cụ xây dựng ứng dụng web mạnh mẽ hơn, phong phú hơn.
46
TÀI LIỆU THAM KHẢO
[1] Thomas Mayer, “Professional CodeIgniter”, 2006
[2] Phạm Công Định, “Mô hình MVC và vai trò của các thành phần trong Web
framework”. 2009
[3] David Upton, “CodeIgniter For Rapid PHP Application Development”, 2006
[4] Kevin McArthur, “Pro PHP Patterns Frameworks Testing and More”, Mar.2008
[5] Jason Gilmore, “Apress Beginning PHP and MySQL 5 From Novice to
Professional”. Appress, 2nd Edition Jan 2006
[6] Mehdi Achour, Friedhelm Betz, Antony Dovgal, Nuno Lopes, Hannes Magnusson.
“PHP Manual”. www.php.net. 2010
[7] Gutmans Frontmatter, “PHP 5 Power Programming”. 2010
Các file đính kèm theo tài liệu này:
- LUẬN VĂN-XÂY DỰNG NỀN TẢNG HỖ TRỢ LẬP TRÌNH WEB DỰA TRÊN MÔ HÌNH MVC.pdf