Menu
Coddy logo textTech

Итоги — Валидатор форм

Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 69 из 91.

challenge icon

Задание

Легко

Давайте создадим валидатор формы регистрации пользователя, который собирает ошибки валидации и сообщает о них всех сразу, а не останавливается на первой же проблеме. Именно так работает валидация форм в реальном мире — пользователи хотят видеть все проблемы со своей заявкой, а не исправлять их по одной.

Вы распределите свой код по четырем файлам:

  • ValidationException.php — Создайте базовый класс ValidationException, который расширяет Exception. Он будет служить родителем для всех исключений, связанных с валидацией.
  • Exceptions.php — Подключите файл ValidationException и создайте три конкретных класса исключений, расширяющих ValidationException:
    • RequiredFieldException — Принимает имя поля в конструкторе и передает сообщение "[fieldName] is required" родителю
    • InvalidEmailException — Принимает строку email в конструкторе и передает сообщение "'[email]' is not a valid email" родителю
    • MinLengthException — Принимает имя поля и минимальную длину (int) в конструкторе и передает сообщение "[fieldName] must be at least [minLength] characters" родителю
  • FormValidator.php — Подключите файл Exceptions и создайте класс FormValidator с этими методами валидации:
    • validateRequired(?string $value, string $fieldName): string — Выбрасывает RequiredFieldException, если значение равно null или пустое (после обрезки пробелов), в противном случае возвращает обрезанное значение
    • validateEmail(string $email): string — Выбрасывает InvalidEmailException, если email невалиден (используйте filter_var с FILTER_VALIDATE_EMAIL), в противном случае возвращает email
    • validateMinLength(string $value, string $fieldName, int $minLength): string — Выбрасывает MinLengthException, если длина строки меньше минимальной, в противном случае возвращает значение
  • main.php — Подключите файл FormValidator. Вы получите три входных значения: имя пользователя (username), email и пароль (password).

    Создайте экземпляр FormValidator и пустой массив для сбора сообщений об ошибках. Проверьте каждое поле в отдельном блоке try-catch:

    • Проверьте username как обязательное поле (required)
    • Проверьте email сначала как обязательное поле, затем проверьте его на соответствие формату email
    • Проверьте password сначала как обязательное поле, затем проверьте, что его минимальная длина составляет 8 символов

    При перехвате ValidationException добавляйте его сообщение в массив ошибок вместо остановки выполнения.

    После всех проверок, если есть ошибки, выведите каждое сообщение об ошибке на новой строке. Если ошибок нет, выведите "Registration successful".

Такой паттерн сбора всех ошибок перед сообщением о них важен для хорошего пользовательского опыта. Ваша иерархия исключений позволяет легко перехватывать все проблемы валидации одним блоком catch, сохраняя при этом специфические типы исключений для различных сбоев валидации.

Попробуйте сами

<?php
require_once 'FormValidator.php';

// Чтение входных данных
$username = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$password = trim(fgets(STDIN));

// Создание экземпляра FormValidator
$validator = new FormValidator();

// Создание пустого массива для сбора сообщений об ошибках
$errors = [];

// TODO: Проверить имя пользователя как обязательное поле в блоке try-catch
// Перехватить ValidationException и добавить его сообщение в массив $errors

// TODO: Сначала проверить email как обязательное поле, затем проверить его на соответствие формату email
// Использовать блок try-catch и добавить любые сообщения об ошибках в массив $errors

// TODO: Сначала проверить пароль как обязательное поле, затем проверить минимальную длину в 8 символов
// Использовать блок try-catch и добавить любые сообщения об ошибках в массив $errors

// TODO: После всех проверок:
// - Если есть ошибки, вывести каждое сообщение об ошибке на отдельной строке
// - Если ошибок нет, вывести "Registration successful"

?>

Все уроки раздела Объектно-ориентированное программирование