Chúng ta đã đi một chặng đường khá dài cùng PHP – từ những dòng code procedural đơn giản đến việc làm quen với lập trình hướng đối tượng (OOP). Để hiểu rõ hơn vai trò thực tiễn của OOP, hôm nay bạn sẽ cùng mình xây dựng một bộ xử lý form có cấu trúc hướng đối tượng – một bước tiến tự nhiên để hướng đến các ứng dụng PHP hiện đại.
Bạn sẽ không chỉ đơn thuần là xử lý form nữa – bạn sẽ kiến tạo một hệ thống nhỏ, có tổ chức, dễ bảo trì, và dễ mở rộng.
Mục tiêu của mini project này là gì?
- Hiểu cách tách biệt logic bằng class
- Tạo class để quản lý dữ liệu nhập từ người dùng
- Viết class để validate dữ liệu
- Dùng OOP để gửi dữ liệu qua email hoặc lưu tạm
- Cảm nhận được “cái hay” của OOP: chia nhỏ, dễ hiểu, dễ test, dễ tái sử dụng
Kịch bản: Một form liên hệ
Form gồm các trường:
- Họ và tên
- Nội dung tin nhắn
Sau khi gửi, hệ thống sẽ:
- Kiểm tra hợp lệ
- Nếu hợp lệ, hiển thị thông báo thành công
- Nếu không, hiển thị lỗi tương ứng
Khởi đầu – Tạo cấu trúc file
project/
├── classes/
│ ├── FormHandler.php
│ ├── Validator.php
├── index.php
├── style.css
Chúng ta sẽ tách class ra thư mục classes để quản lý sạch sẽ, dễ nâng cấp sau này.
Class Validator – Kiểm tra dữ liệu
// classes/Validator.php
class Validator {
public $errors = [];
public function validate($data) {
if (empty($data['name'])) {
$this->errors['name'] = 'Vui lòng nhập họ và tên';
}
if (empty($data['email']) || !filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
$this->errors['email'] = 'Email không hợp lệ';
}
if (empty($data['message'])) {
$this->errors['message'] = 'Vui lòng nhập nội dung';
}
return empty($this->errors);
}
public function getErrors() {
return $this->errors;
}
}
💡 Ở đây bạn thấy rõ một lợi thế: Nếu sau này bạn muốn thêm điều kiện, bạn chỉ cần sửa class này, không đụng chạm tới index.php.
3. Class FormHandler – Xử lý logic form
// classes/FormHandler.php
class FormHandler {
protected $validator;
public function __construct($validator) {
$this->validator = $validator;
}
public function handle($data) {
if ($this->validator->validate($data)) {
// Có thể gửi mail hoặc lưu vào file
return ['success' => true, 'message' => 'Đã gửi thành công!'];
} else {
return ['success' => false, 'errors' => $this->validator->getErrors()];
}
}
}
📌 Lưu ý cách FormHandler không cần biết cụ thể validate như thế nào – nó chỉ dùng class Validator. Đây là nguyên lý phân chia trách nhiệm trong OOP (Single Responsibility Principle).
4. Giao diện và xử lý – index.php
<?php
require_once 'classes/Validator.php';
require_once 'classes/FormHandler.php';
$validator = new Validator();
$form = new FormHandler($validator);
$result = null;
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$result = $form->handle($_POST);
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Liên hệ</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h2>Form liên hệ</h2>
<?php if ($result): ?>
<?php if ($result['success']): ?>
<p class="success"><?= $result['message'] ?></p>
<?php else: ?>
<ul class="errors">
<?php foreach ($result['errors'] as $error): ?>
<li><?= $error ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<?php endif; ?>
<form method="post">
<label>Họ và tên:
<input type="text" name="name" value="<?= $_POST['name'] ?? '' ?>">
</label><br>
<label>Email:
<input type="email" name="email" value="<?= $_POST['email'] ?? '' ?>">
</label><br>
<label>Nội dung:
<textarea name="message"><?= $_POST['message'] ?? '' ?></textarea>
</label><br>
<button type="submit">Gửi</button>
</form>
</body>
</html>
5. Style nhẹ nhàng – style.css
body { font-family: Arial; padding: 20px; max-width: 600px; margin: auto; }
.success { color: green; }
.errors { color: red; list-style: none; padding: 0; }
label { display: block; margin-top: 10px; }
input, textarea { width: 100%; padding: 8px; margin-top: 4px; }
button { margin-top: 12px; }
Tổng kết
Qua mini project này, bạn vừa làm quen:
- Tổ chức mã theo hướng đối tượng
- Tách riêng trách nhiệm:
Validatorđể kiểm tra –FormHandlerđể xử lý - Cảm nhận được sự “gọn gàng” và dễ bảo trì của code OOP
Gợi ý nâng cấp
- Gửi email thật (dùng
mail()hoặc thư viện PHPMailer) - Ghi log vào file để lưu lịch sử
- Giao diện đẹp hơn bằng Tailwind hoặc Bootstrap
Bài học tiếp theo?
Đây là lúc bạn đã sẵn sàng cho Chương 5 – Tổng kết và mở rộng tư duy. Hẹn gặp bạn ở phần tiếp theo để xây dựng một hệ thống quản lý thực tế hơn nữa!

Thảo luận