Menu
Coddy logo textTech

Podsumowanie — walidator formularzy

Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 69 z 91.

challenge icon

Wyzwanie

Łatwy

Zbudujmy walidator formularza rejestracji użytkownika, który zbiera błędy walidacji i zgłasza je wszystkie naraz, zamiast zatrzymywać się na pierwszym problemie. Tak działa walidacja formularzy w praktyce: użytkownicy chcą zobaczyć wszystkie problemy związane z przesłanymi danymi, a nie poprawiać je po kolei.

Rozmieścisz swój kod w czterech plikach:

  • ValidationException.php: Utwórz bazową klasę ValidationException, która rozszerza Exception. Będzie ona klasą nadrzędną dla wszystkich wyjątków związanych z walidacją.
  • Exceptions.php: Dołącz plik ValidationException i utwórz trzy konkretne klasy wyjątków rozszerzające ValidationException:
    • RequiredFieldException: Przyjmuje nazwę pola w konstruktorze i przekazuje klasie nadrzędnej komunikat "[fieldName] is required"
    • InvalidEmailException: Przyjmuje ciąg znaków z adresem e-mail w konstruktorze i przekazuje klasie nadrzędnej komunikat "'[email]' is not a valid email"
    • MinLengthException: Przyjmuje nazwę pola i minimalną długość (int) w konstruktorze i przekazuje klasie nadrzędnej komunikat "[fieldName] must be at least [minLength] characters"
  • FormValidator.php: Dołącz plik Exceptions i utwórz klasę FormValidator z następującymi metodami walidacji:
    • validateRequired(?string $value, string $fieldName): string: Zgłasza RequiredFieldException, jeśli wartość ma wartość null lub jest pusta (po usunięciu białych znaków), a w przeciwnym razie zwraca wartość po usunięciu białych znaków
    • validateEmail(string $email): string: Zgłasza InvalidEmailException, jeśli adres e-mail jest nieprawidłowy (użyj filter_var z FILTER_VALIDATE_EMAIL), a w przeciwnym razie zwraca adres e-mail
    • validateMinLength(string $value, string $fieldName, int $minLength): string: Zgłasza MinLengthException, jeśli długość ciągu znaków jest mniejsza niż minimum, a w przeciwnym razie zwraca wartość
  • main.php: Dołącz plik FormValidator. Otrzymasz trzy dane wejściowe: nazwę użytkownika, adres e-mail i hasło.

    Utwórz obiekt FormValidator oraz pustą tablicę do zbierania komunikatów o błędach. Waliduj każde pole w osobnym bloku try-catch:

    • Sprawdź, czy nazwa użytkownika jest wymagana
    • Najpierw sprawdź, czy adres e-mail jest wymagany, a następnie sprawdź, czy ma prawidłowy format adresu e-mail
    • Najpierw sprawdź, czy hasło jest wymagane, a następnie sprawdź, czy ma co najmniej 8 znaków

    Przechwytując wyjątek ValidationException, dodaj jego komunikat do tablicy błędów zamiast zatrzymywać wykonywanie programu.

    Po wszystkich walidacjach, jeśli wystąpiły błędy, wypisz każdy komunikat o błędzie w osobnym wierszu. Jeśli nie ma błędów, wypisz "Registration successful".

Ten sposób zbierania wszystkich błędów przed ich zgłoszeniem jest niezbędny dla zapewnienia dobrego doświadczenia użytkownika. Hierarchia wyjątków ułatwia przechwycenie wszystkich problemów z walidacją w jednym bloku catch, a jednocześnie pozwala zachować osobne typy wyjątków dla różnych błędów walidacji.

Spróbuj swoich sił

<?php
require_once 'FormValidator.php';

// Odczytaj dane wejściowe
$username = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$password = trim(fgets(STDIN));

// Utwórz instancję FormValidator
$validator = new FormValidator();

// Utwórz pustą tablicę do zbierania komunikatów o błędach
$errors = [];

// TODO: Sprawdź w bloku try-catch, czy username zostało podane
// Przechwyć ValidationException i dodaj jego komunikat do tablicy $errors

// TODO: Najpierw sprawdź, czy email został podany, a następnie czy ma poprawny format adresu e-mail
// Użyj bloku try-catch i dodaj wszystkie komunikaty o błędach do tablicy $errors

// TODO: Najpierw sprawdź, czy password zostało podane, a następnie czy ma co najmniej 8 znaków
// Użyj bloku try-catch i dodaj wszystkie komunikaty o błędach do tablicy $errors

// TODO: Po zakończeniu wszystkich walidacji:
// - Jeśli występują błędy, wypisz każdy komunikat o błędzie w osobnym wierszu
// - Jeśli nie ma błędów, wypisz "Registration successful"

?>

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator PHP online