Khái niệm MVC trong Lập trình Web và Giới thiệu Hiphop Framework

MỤC LỤC

Vai trò của các thành phần M-V-C trong Web framework

 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. 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. 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.

Hình 1.0.2 Biểu đồ tuần tự một chuỗi MVC đơn giản
Hình 1.0.2 Biểu đồ tuần tự một chuỗi MVC đơn giản

GIỚI THIỆU FRAMEWORK ĐÃ XÂY DỰNG

Kiến trúc của Hiphop framework

    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ể. 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). 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. 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. 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.

    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.

    Hình 2.0.5 Quy trình xử lý một HTTP request - Hiphop framework
    Hình 2.0.5 Quy trình xử lý một HTTP request - Hiphop framework

    CÁC KHÁI NIỆM BAN ĐẦU KHI XÂY DỰNG ỨNG DỤNG WEB BẰNG HIPHOP FRAMEWORK

      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 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.

      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/.  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. 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.

      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. 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/. 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.

      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.

      Hình 3.0.13 Minh họa Sơ đồ phân cấp controller trang chủ
      Hình 3.0.13 Minh họa Sơ đồ phân cấp controller trang chủ

      HỆ THỐNG CÁC LỚP THƯ VIỆN VÀ HÀM HỖ TRỢ - LIBRARY & HELPER

      Các lớp thư viện .1. Email library

        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. 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. 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.

        “Đọ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. (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. 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.

        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ề. 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. 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.

        Đó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.

        Các Helper .1. Array Helper

          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ể. 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. 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.

          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. 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 “-”. 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.

          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. Trả về segment ứng với thứ tự trong tham số $order của URL hiện tại.

          ÁP DỤNG HIPHOP FRAMEWORK XÂY DỰNG TRANG BLOG CÁ NHÂN

          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 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ủ. 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.

           getMostViewEntry(): lấy danh sách các bài được xem nhiều nhất, trả về cho Controller con MostViewBox. 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. + 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ú.