• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Prostszy wariant walidacji

Aruba Cloud - Virtual Private Server VPS
0 głosów
182 wizyt
pytanie zadane 19 stycznia 2021 w PHP przez CSSoup Mądrala (6,460 p.)

Czy taki sposób walidacji jest okej, czy da się to jakoś uprościć?

<?php

declare(strict_types=1);

namespace vLib\app;

class UsersValidator
{
  private array $patterns =
  [
    'uid' => '/^[A-Za-z0-9_]{8,255}$/',
    'email' => '/^(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22))(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\]))$/iD',
    'pwd' => '/^[a-zA-Z0-9\-_]{8,64}$/',
  ];

  public function emptyInputs(
    array $data,
    string $prevKey = null,
    $prevIsEmpty = null
  ): bool {
    $isEmpty = is_null($prevIsEmpty) ? false : $prevIsEmpty;

    foreach ($data as $key => $dataItem) {
      if (is_array($dataItem)) {
        $isEmpty = $this->emptyInputs($dataItem, $key, $isEmpty);
      } else if (empty($dataItem)) {
        $errTitle = $prevKey . ucfirst($key) . 'Err';
        Notifications::setNotification($errTitle, 'Pole jest puste.');
        $isEmpty = true;
      }
    }
    return $isEmpty;
  }

  public function validation(array $data): bool
  {
    $isCorrect = true;
    if (!$this->checkData($data['uid']['content'], 'uid')) {
      Notifications::setNotification('uidContentErr', 'test');
      $isCorrect = false;
    }
    if (!$this->checkData($data['email']['content'], 'email')) {
      Notifications::setNotification('emailContentErr', 'test');
      $isCorrect = false;
    }
    if (!$this->checkData($data['pwd']['content'], 'pwd')) {
      Notifications::setNotification('pwdContentErr', 'test');
      $isCorrect = false;
    }

    if ($this->emptyInputs($data))
      $isCorrect = false;

    return $isCorrect;
  }

  private function checkData(string $value, string $pattern): bool
  {
    return (bool) preg_match($this->patterns[$pattern], $value);
  }
}

 

1 odpowiedź

+1 głos
odpowiedź 19 stycznia 2021 przez mordimer Mądrala (5,720 p.)
wybrane 20 stycznia 2021 przez CSSoup
 
Najlepsza
Ta klasa robi za duzo te trzy reguly powinny byc osobnymi walidatorami ... Dodatkowo wysylasz jeszcze jakies powiadomiania ... Co bys zrobil teraz jakbys mial odpalic jedna regule walidacji w jakims szczegolnym przypadku w dodatku bez powiadomienia ?
komentarz 19 stycznia 2021 przez CSSoup Mądrala (6,460 p.)
Ok, dzięki podzielę to w ten sposób.
komentarz 19 stycznia 2021 przez CSSoup Mądrala (6,460 p.)

@mordimer,
 Teraz po zmianie zrobiłem coś takiego:

- Stworzyłem oddzielne klasy, UidValidator, EmailValidator, PwdValidator, FormValidator

- Utworzyłem jeden walidator który ogarnia całą walidację rejestracji (RegisterValidator). Mam zamiar zrobić podobnie z logowaniem. Walidator składa się z wyżej wymienionych instancji klas i każda metoda odpowiada walidacji przy użyciu innego walidatora + tam są już wysyłane powiadomienia do użytkownika, ale już się nie gryzie to tak jak wcześniej, więc jeżeli będzie potrzeba to w każdej chwili w dowolnym miejscu aplikacji można już posłużyć się wyodrębnioną regułą.

 

Kodu nie wstawiam bardziej chodzi i o to czy mój zamysł jest ok?

komentarz 19 stycznia 2021 przez mordimer Mądrala (5,720 p.)
No to już ma sens :). Ja bym zrobił podobnie stworzył sobie jeden wspólny interfejs dla walidatorów wstrzykiwał je do jakiegoś serwisu (klasy co odpalała by tą logikę). W tym serwisie przeleciał bym po nich przy użyciu polimorfizmu. Finalnie jak coś pójdzie nie tak zwracał bym jakąś kolekcje błędów i z nią już bym robił co dusza zapragnie :). Ty tam to zrób jak chcesz tylko unikaj takich klas scyzoryków bo jak sam zauważyłeś tak ja kto zrobiłeś na początku jest nie praktyczne. A tak masz pojedyncze klasy które możesz wyciągać i podmieniać jak klocki i nie masz tak silnych zależności w kodzie.
komentarz 20 stycznia 2021 przez CSSoup Mądrala (6,460 p.)
Ok, jeszcze raz dzięki. Muszę w takim razie sobie bardziej ogarnąć zasady SOLID, a potem dociągnąć do tego jakieś wzorce projektowe z tego co wnioskuję po twojej wypowiedzi.

Podobne pytania

0 głosów
2 odpowiedzi 462 wizyt
pytanie zadane 2 lutego 2021 w PHP przez mi-20 Stary wyjadacz (13,250 p.)
0 głosów
1 odpowiedź 198 wizyt
pytanie zadane 14 grudnia 2017 w PHP przez White Cat Nowicjusz (160 p.)
0 głosów
3 odpowiedzi 199 wizyt
pytanie zadane 4 października 2017 w PHP przez kevin Mądrala (5,010 p.)

93,329 zapytań

142,323 odpowiedzi

322,400 komentarzy

62,664 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...