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

Prostszy wariant walidacji

VPS Starter Arubacloud
0 głosów
126 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 336 wizyt
pytanie zadane 2 lutego 2021 w PHP przez mi-20 Stary wyjadacz (13,190 p.)
0 głosów
1 odpowiedź 169 wizyt
pytanie zadane 14 grudnia 2017 w PHP przez White Cat Nowicjusz (160 p.)
0 głosów
3 odpowiedzi 170 wizyt
pytanie zadane 4 października 2017 w PHP przez kevin Mądrala (5,010 p.)

92,786 zapytań

141,718 odpowiedzi

320,661 komentarzy

62,115 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.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...