Повторение — валидатор формы
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 69 из 91.
Задание
ЛегкоДавайте создадим валидатор формы регистрации пользователя, который собирает ошибки валидации и сообщает о них все сразу, вместо того чтобы останавливаться на первой проблеме. Именно так работает валидация форм в реальных приложениях: пользователи хотят видеть все проблемы со своей отправкой, а не исправлять их по одной.
Вы распределите свой код по четырём файлам:
ValidationException.php: Create базовыйValidationExceptionclass, который extendsException. Он служит родительским class для всех исключений, связанных с валидацией.Exceptions.php: Подключите файл ValidationException и создайте три конкретных class исключений, которые extendsValidationException: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 и создайте classFormValidatorсо следующими методами валидации:validateRequired(?string $value, string $fieldName): string: ВыбрасываетRequiredFieldException, если значение равно null или empty (после удаления пробелов), в противном случае возвращает значение без лишних пробеловvalidateEmail(string $email): string: ВыбрасываетInvalidEmailException, если email недействителен (используйтеfilter_varсFILTER_VALIDATE_EMAIL), в противном случае возвращает emailvalidateMinLength(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"
?>Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Повторение — простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыПовторение — иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateМодификаторы доступа подробноГеттеры и сеттерыСокрытие информацииПродвижение конструктора (8.0)Повторение — система учёта студентов2Пространства имён и автозагрузка
Введение в пространства имёнКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerПовторение — структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс и абстрактный классАннотация типов с интерфейсамиПовторение — калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeПовторение — пользовательская коллекция11Система типов и обработка ошибок
Объявления типовNullable-типыОбъединение и пересечение типовКлассы исключенийПользовательская иерархия исключенийTry, Catch, FinallyПовторение — валидатор формы3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищённые свойстваСвойства только для чтения (PHP 8.1)Повторение — менеджер банковского счёта6Полиморфизм
Повторение переопределения методовПолиморфизм через интерфейсыАннотации типов и объединённые типыПозднее статическое связываниеПовторение — обработчик платежей9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования, часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн StrategyПотренируйтесь самостоятельно: Онлайн-компилятор PHP