Menu
CoddyTech

Ôn tập: Trình xác thực biểu mẫu

Thuộc phần Lập trình hướng đối tượng trong hành trình PHP của Coddy. Bài học 69 trên 91.

challenge icon

Thử thách

Dễ

Hãy xây dựng một bộ xác thực biểu mẫu đăng ký người dùng, thu thập các lỗi xác thực và báo cáo tất cả cùng lúc, thay vì dừng lại ở lỗi đầu tiên. Đây là cách xác thực biểu mẫu trong thực tế hoạt động: người dùng muốn thấy mọi vấn đề trong nội dung gửi đi, chứ không phải sửa từng vấn đề một.

Bạn sẽ sắp xếp code trong bốn tệp:

  • ValidationException.php: Tạo lớp cơ sở ValidationException kế thừa Exception. Lớp này làm lớp cha cho mọi ngoại lệ liên quan đến xác thực.
  • Exceptions.php: Nạp tệp ValidationException và tạo ba lớp ngoại lệ cụ thể kế thừa ValidationException:
    • RequiredFieldException: Nhận tên trường trong hàm khởi tạo và truyền thông báo "[fieldName] is required" cho lớp cha
    • InvalidEmailException: Nhận chuỗi email trong hàm khởi tạo và truyền thông báo "'[email]' is not a valid email" cho lớp cha
    • MinLengthException: Nhận tên trường và độ dài tối thiểu (int) trong hàm khởi tạo, rồi truyền thông báo "[fieldName] must be at least [minLength] characters" cho lớp cha
  • FormValidator.php: Nạp tệp Exceptions và tạo lớp FormValidator với các phương thức xác thực sau:
    • validateRequired(?string $value, string $fieldName): string: Ném RequiredFieldException nếu giá trị là null hoặc rỗng (sau khi cắt khoảng trắng), nếu không thì trả về giá trị đã cắt khoảng trắng
    • validateEmail(string $email): string: Ném InvalidEmailException nếu email không hợp lệ (dùng filter_var với FILTER_VALIDATE_EMAIL), nếu không thì trả về email
    • validateMinLength(string $value, string $fieldName, int $minLength): string: Ném MinLengthException nếu độ dài chuỗi nhỏ hơn độ dài tối thiểu, nếu không thì trả về giá trị
  • main.php: Nạp tệp FormValidator. Bạn sẽ nhận ba đầu vào: tên người dùng, email và mật khẩu.

    Tạo một FormValidator và một mảng rỗng để thu thập thông báo lỗi. Xác thực từng trường trong một khối try-catch riêng:

    • Xác thực tên người dùng là trường bắt buộc
    • Trước tiên, xác thực email là trường bắt buộc, sau đó xác thực email đúng định dạng
    • Trước tiên, xác thực mật khẩu là trường bắt buộc, sau đó xác thực mật khẩu có độ dài tối thiểu là 8 ký tự

    Khi bắt một ValidationException, hãy thêm thông báo của ngoại lệ vào mảng lỗi thay vì dừng chương trình.

    Sau khi hoàn tất mọi bước xác thực, nếu có lỗi, hãy in từng thông báo lỗi trên một dòng riêng. Nếu không có lỗi, hãy in "Registration successful".

Cách thu thập mọi lỗi trước khi báo cáo này rất quan trọng để mang lại trải nghiệm tốt cho người dùng. Cấu trúc phân cấp ngoại lệ giúp bạn dễ dàng bắt mọi lỗi xác thực bằng một khối catch duy nhất, đồng thời vẫn giữ được các kiểu ngoại lệ cụ thể cho từng lỗi xác thực.

Tự làm thử

<?php
require_once 'FormValidator.php';

// Đọc dữ liệu đầu vào
$username = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$password = trim(fgets(STDIN));

// Tạo một instance của FormValidator
$validator = new FormValidator();

// Tạo một mảng rỗng để lưu các thông báo lỗi
$errors = [];

// TODO: Kiểm tra username là trường bắt buộc trong khối try-catch
// Bắt ngoại lệ ValidationException và thêm thông báo của nó vào mảng $errors

// TODO: Trước tiên kiểm tra email là trường bắt buộc, sau đó kiểm tra định dạng email hợp lệ
// Dùng khối try-catch và thêm mọi thông báo lỗi vào mảng $errors

// TODO: Trước tiên kiểm tra password là trường bắt buộc, sau đó kiểm tra độ dài tối thiểu là 8 ký tự
// Dùng khối try-catch và thêm mọi thông báo lỗi vào mảng $errors

// TODO: Sau khi hoàn tất mọi bước kiểm tra:
// - Nếu có lỗi, in mỗi thông báo lỗi trên một dòng riêng
// - Nếu không có lỗi, in "Registration successful"

?>

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch PHP online