Menu
Coddy logo textTech

Повторение — валидатор формы

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

challenge icon

Задание

Легко

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

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

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

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

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

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

    После всех проверок, если есть ошибки, выведите каждое сообщение об ошибке в отдельной строке. Если ошибок нет, выведите "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: Проверить username как обязательное в блоке try-catch
// Перехватить ValidationException и добавить его сообщение в массив $errors

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

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

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

?>

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

Потренируйтесь самостоятельно: Онлайн-компилятор PHP