Mini Project: Bộ xử lý form có cấu trúc hướng đối tượng

jk5587725

By jk5587725

Cập nhật Tháng 9 23, 2025

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
  • Email
  • Nội dung tin nhắn

Sau khi gửi, hệ thống sẽ:

  1. Kiểm tra hợp lệ
  2. Nếu hợp lệ, hiển thị thông báo thành công
  3. 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

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Đăng ký nhận tin mới

Nhận bài học, tài nguyên và cơ hội việc làm qua email hàng tuần.

[global_subscribe_form]

Chúng tôi cam kết không spam. Bạn có thể hủy bất cứ lúc nào.