Dự án MVC (Model-View-Controller) trong PHP là một kiến trúc phần mềm phổ biến giúp phân chia mã nguồn thành ba phần chính: Model, View, và Controller, giúp cải thiện khả năng bảo trì và mở rộng hệ thống.
Các thành phần trong mô hình MVC:
Model (Mô hình):
Chức năng: Là phần quản lý dữ liệu và logic nghiệp vụ của ứng dụng. Model thực hiện các thao tác với cơ sở dữ liệu và trả về kết quả cho controller.
Ví dụ: Một lớp Model có thể thực hiện các thao tác như thêm, sửa, xóa dữ liệu trong cơ sở dữ liệu.
View (Giao diện):
Chức năng: Là phần giao diện người dùng. View nhận dữ liệu từ Controller và hiển thị cho người dùng. View không có logic nghiệp vụ mà chỉ tập trung vào việc trình bày.
Ví dụ: Các trang HTML hoặc file PHP có chứa mã HTML để hiển thị nội dung cho người dùng.
Controller (Điều khiển):
Chức năng: Là cầu nối giữa Model và View. Controller nhận các yêu cầu từ người dùng, xử lý (bao gồm cả việc tương tác với Model) và gửi dữ liệu đến View để hiển thị.
Ví dụ: Controller có thể nhận yêu cầu POST từ người dùng, gọi Model để lấy dữ liệu từ cơ sở dữ liệu, rồi chuyển kết quả đó đến View để hiển thị.
Cấu trúc thư mục dự án MVC PHP:
Một cấu trúc thư mục phổ biến trong dự án MVC PHP có thể như sau:
Tạo cấu trúc thư mục dự án: Bạn cần tạo một thư mục chứa tất cả mã nguồn của bạn, chia thành các thư mục con cho Model, View, Controller, và các thư mục khác như public, core, config.
Xây dựng Router: Bạn cần phải có một router để nhận yêu cầu từ người dùng và điều hướng đến Controller thích hợp. Điều này có thể thực hiện trong file index.php trong thư mục public.
Tạo Controller: Tạo các controller để xử lý các yêu cầu từ người dùng. Mỗi controller sẽ có các hành động (actions) tương ứng với các yêu cầu (thường là các phương thức).
Tạo Model: Tạo các lớp Model để quản lý dữ liệu và tương tác với cơ sở dữ liệu. Các Model này sẽ cung cấp các phương thức để thực hiện các thao tác CRUD.
Tạo View: Xây dựng các file View để hiển thị dữ liệu mà controller truyền vào. Các View sẽ chủ yếu chứa HTML và mã PHP để hiển thị thông tin cho người dùng.
Ví dụ đơn giản về một dự án MVC PHP:
1. File index.php (Điểm vào):
<?php// Autoload classes using composer or manuallyrequire_once'../core/Controller.php';require_once'../core/Model.php';require_once'../core/View.php';// Include controllersrequire_once'../app/controllers/HomeController.php';// Router logic (basic example)$controller =newHomeController();$controller->index();
<?phpclassUser {publicfunctiongetAllUsers() {// Connect to database and fetch users (simplified example)// Assuming you have a database connection established $query ="SELECT*FROM users";// Execute query and return resultsreturn []; // Return mock data or database result here }}
Database: Kết nối cơ sở dữ liệu có thể thực hiện trong một lớp riêng biệt, hoặc sử dụng PDO/ORM để dễ dàng thao tác với cơ sở dữ liệu.
Routing: Bạn có thể sử dụng .htaccess để điều hướng tất cả các yêu cầu đến index.php, giúp MVC hoạt động như một ứng dụng web.
Sử dụng Composer và các thư viện bên ngoài:
Dự án MVC trong PHP có thể sử dụng các thư viện như Twig cho View, PHPMailer cho gửi email, hoặc Slim/Laravel nếu bạn muốn phát triển nhanh hơn với các framework đầy đủ tính năng.
Với mô hình MVC, ứng dụng của bạn sẽ dễ bảo trì và mở rộng vì bạn có thể thay đổi logic nghiệp vụ (Model), giao diện (View), và xử lý yêu cầu (Controller) một cách độc lập mà không làm ảnh hưởng đến các phần khác của hệ thống.
Example 2
Dưới đây là một ví dụ đầy đủ về dự án MVC PHP từ cấu trúc thư mục đến mã nguồn cho mỗi phần. Ví dụ này sẽ bao gồm các thành phần cơ bản của một dự án MVC như Model, View, Controller, và cấu hình cơ bản.
<?phpclassHomeControllerextendsController {publicfunctionindex() {// Load data from model $userModel =$this->model('User'); $users = $userModel->getAllUsers();// Load the view and pass data$this->view('home', ['users'=> $users]); }}
Cài đặt Composer: Nếu bạn sử dụng Composer để quản lý các thư viện, bạn có thể chạy lệnh composer install để tải các thư viện.
Cài đặt Apache: Đảm bảo rằng bạn đã cài đặt Apache hoặc một server web hỗ trợ PHP, và cấu hình .htaccess cho phép URL rewrite.
Tạo Cơ sở dữ liệu: Đảm bảo bạn đã tạo cơ sở dữ liệu mvc_database và bảng users với các trường id, name, email.
Chạy ứng dụng: Mở trình duyệt và truy cập vào http://localhost/mvc-project/public/.
Tổng kết:
Dự án MVC PHP này có đầy đủ các phần cơ bản để bạn có thể phát triển thêm: Model, View, Controller và Routing. Bạn có thể mở rộng dự án này bằng cách thêm tính năng mới, tạo thêm controller và views, cũng như xử lý các hành động phức tạp hơn.
Example 3
Dưới đây là một ví dụ về dự án MVC PHP hoàn chỉnh, bao gồm cả source code và cơ sở dữ liệu. Dự án này sẽ bao gồm 3 thành phần chính: Model, View, Controller và cách thiết lập cơ sở dữ liệu.
Đầu tiên, bạn cần tạo một cơ sở dữ liệu và bảng để lưu trữ thông tin người dùng. Dưới đây là câu lệnh SQL để tạo cơ sở dữ liệu và bảng users.
Câu lệnh SQL để tạo cơ sở dữ liệu và bảng users:
-- Tạo cơ sở dữ liệuCREATEDATABASEmvc_database;-- Sử dụng cơ sở dữ liệuUSE mvc_database;-- Tạo bảng `users`CREATETABLEusers ( id INT AUTO_INCREMENT PRIMARY KEY,nameVARCHAR(100) NOT NULL, email VARCHAR(100) NOT NULLUNIQUE,passwordVARCHAR(255) NOT NULL);-- Thêm dữ liệu mẫu vào bảng `users`INSERT INTO users (name, email, password) VALUES('John Doe', 'john.doe@example.com', 'password123'),('Jane Smith', 'jane.smith@example.com', 'password456'),('Michael Johnson', 'michael.johnson@example.com', 'password789');
3. Source code của Dự án MVC PHP
3.1. File public/index.php (Điểm vào của ứng dụng):
<?php// Autoload Composer libraries if usedrequire_once'../vendor/autoload.php';// Include core classesrequire_once'../core/Controller.php';require_once'../core/Model.php';require_once'../core/View.php';// Parse URL to route requests$url =isset($_GET['url'])? $_GET['url'] :'home/index';$url =rtrim($url,'/');$url =explode('/', $url);// Controller và action từ URL$controllerName =ucfirst($url[0]).'Controller';$actionName =isset($url[1])? $url[1] :'index';// Load controller filerequire_once'../app/controllers/'. $controllerName .'.php';// Create controller object$controller =new$controllerName();// Call action methodcall_user_func(array($controller, $actionName));
<?phpclassHomeControllerextendsController {publicfunctionindex() {// Load data from model $userModel =$this->model('User'); $users = $userModel->getAllUsers();// Load the view and pass data$this->view('home', ['users'=> $users]); }}
Tạo cơ sở dữ liệu và bảng users bằng câu lệnh SQL trên.
Thêm một số dữ liệu mẫu vào bảng users để có thể hiển thị trong giao diện.
Cài đặt Apache hoặc Nginx:
Đảm bảo máy chủ web của bạn hỗ trợ PHP và có cấu hình .htaccess (Apache).
Nếu bạn sử dụng Nginx, cần thay đổi cấu hình để hỗ trợ URL rewrite.
Chạy ứng dụng:
Mở trình duyệt và truy cập http://localhost/mvc-project/public/ để xem danh sách người dùng.
Nếu bạn đã thiết lập chính xác, ứng dụng sẽ hiển thị danh sách người dùng từ cơ sở dữ liệu.
Tổng kết:
Dự án MVC PHP này cung cấp cấu trúc đầy đủ cho việc phát triển ứng dụng web với ba phần chính: Model, View, và Controller. Các lớp Model giúp tương tác với cơ sở dữ liệu, Controller xử lý các yêu cầu từ người dùng và View hiển thị dữ liệu lên giao diện người dùng. Bạn có thể mở rộng ứng dụng này bằng cách thêm các tính năng như thêm, sửa, xóa người dùng hoặc các tính năng khác.
public\index.php
<?php// Autoload Composer libraries if used// require_once '../vendor/autoload.php';// Include core classesrequire_once'../core/Controller.php';require_once'../core/Model.php';require_once'../core/View.php';// Parse URL to route requests$url =isset($_GET['url'])? $_GET['url'] :'home/index';$url =rtrim($url,'/');$url =explode('/', $url);// Controller và action từ URL$controllerName =ucfirst($url[0]).'Controller';$actionName =isset($url[1])? $url[1] :'index';// Load controller filerequire_once'../app/controllers/'. $controllerName .'.php';// Create controller object$controller =new$controllerName();// Call action methodcall_user_func( array($controller, $actionName));
<?phpclassHomeControllerextendsController{publicfunctionindex() {// Load data from model $userModel =$this->model('User'); $users = $userModel->getAllUsers();// Load the view and pass data$this->view('home', ['users'=> $users]); }}
app\controllers\UserController.php
<?phpclassUserControllerextendsController{publicfunctionindex() {// Load data from model $userModel =$this->model('User'); $users = $userModel->getAllUsers();// Load the view and pass data$this->view('home', ['users'=> $users]); }}
app\models\User.php
<?phpclassUserextendsModel{publicfunctiongetAllUsers() { $stmt =$this->db->prepare("SELECT*FROM users"); $stmt->execute();return $stmt->fetchAll(PDO::FETCH_ASSOC); }publicfunctiongetUserById($id) { $stmt =$this->db->prepare("SELECT*FROM users WHERE id = ?"); $stmt->execute([$id]);return $stmt->fetch(PDO::FETCH_ASSOC); }}