Wygrzebane z GitHuba (3) : Validation

W dzisiej­szym odcinku weźmie udział „najwspa­nial­szy z kiedy­kol­wiek stwo­rzo­nych silnik do wali­da­cji danych w PHP” — Vali­da­tion. Projekt rozwija groź­nie brzmiąca grupa progra­mi­stów o nazwie Respect z Brazy­lii. Mam nadzieję, że po tym wpisie nie wylą­duję w lesie wycią­gnięty z bagaż­nika jakie­goś starego Mercedesa…

Projekt speł­nia normy, które są oczy­wi­ste przy czyta­niu kodu takich gigan­tów jak Zend Frame­work 2 czy Symfony, a więc używa­nie name­spa­ces, drze­wia­sta struk­tura klas i kata­lo­gów, kompa­ty­bil­ność ze stan­dar­do­wym auto­lo­ade­rem klas SplC­las­sLo­ader, własne rozsze­rze­nia wyjąt­ków. Jedyny zgrzyt to poziom doku­men­ta­cji. Auto­mat raczej nie da rady w pełni wyge­ne­ro­wać typów para­me­trów metod i zwra­ca­nych warto­ści. W nagrodę za to dostęp­nych jest dzie­siątki testów jednost­ko­wych. Co jak co, ale wali­da­tor spraw­dza­jący czyjeś dane sam powi­nien być grun­tow­nie sprawdzony ;-)

Powszech­nie wiadomo, że w PHP nie można użyć konstruk­cji typu

new Obiekt()->metoda();

Zamiast tego można stoso­wać metody statyczne, które w rezul­ta­cie zwrócą nam obiekt lub też można zasto­so­wać tak lubia­nego przez was Harrego Pottera. Twórcy biblio­teki czarują często i gęsto.

Auto­rzy Vali­da­tion propo­nują używa­nie w nastę­pu­jący sposób:

// deklarujemy uzywany namespace i robimy alias do klasy Validator
use Respect\Validation\Validator as v;
 
// mozemy albo najpierw przygotowac obiekt walidatora
$walidator = v::string()->between('a', 'c');
 
// albo tez bezposrednio uzywac w instrukcjach warunkowych, np.
if (v::numeric()->positive()->validate($cos)) echo 'prawda';
 
//i potem uzywac do sprawdzania jednej z trzech metod:
 
// zwroci tylko true albo false
$walidator->validate($cos);
 
// wypluje wyjatek z pierwszym bledem
$walidator->check($cos);
 
// wypluje wyjatek ze wszystkimi bledami
$walidator->assert($cos);

Warun­ków, które możemy spraw­dzać jest kilka­dzie­siąt. Można popa­trzeć po plikach. Z ciekaw­szych to wymie­niony wyżej

between()

dla zakresu znaków,

in(array('wartosc1' , 'wartosc2))

dla dozwo­lo­nych warto­ści oraz konstrukcja

v::each(v::warunek())->validate(array('wartosc1','wartosc2'));

dla spraw­dze­nia wszyst­kich warto­ści w tablicy. Ponadto można tworzyć kompo­zyty różnych warun­ków za pomocą

v::allOf($walidator1,$walidator2);

(jeżeli wszyst­kie muszą przejść) oraz

oneOf()

(jeżeli wystar­czy nam, że przej­dzie tylko jeden z warun­ków żeby wali­da­cja była poprawna). Dodat­kowo można używać wali­da­to­rów z Zend Frame­worka i Symfony.

Tyle było chwa­le­nia, teraz wady:

  • zamie­sza­nie w wyjąt­kach — często widzimy {{failed}} zamiast komu­ni­katu błędu,
  • zachę­ca­nie do bezpo­śred­niego majstro­wa­nia przy niepu­blicz­nych polach obiek­tów za pomocą metody attri­bute() (w bebe­chach widać, że metoda zmie­nia dostęp do zmien­nej za pomocą klasy Reflec­tion­Pro­perty) zamiast tego attri­bute() powinno przyj­mo­wać ewen­tu­al­nie nazwy metod dostę­po­wych do zmien­nych i w ten sposób sprawdzać.

Tak czy siak, projek­tanci idą w dobrym kierunku. Wszystko ładnie ze sobą współ­pra­cuje, ja kilku nowych trików się nauczy­łem. Pozo­staje bacz­nie obser­wo­wać postępy. Pozdro dla pozo­sta­łych GitHu­bo­wych podglądaczy ;-)

Podobne wpisy:

  1. Wygrze­bane z GitHuba (6) : Monolog
  2. Wygrze­bane z GitHuba (4) : PHP User Agent
  3. Wygrze­bane z GitHuba (2) : Imagine
  4. Wygrze­bane z GitHuba (1) : CSS Crush

2 Comments

  • 11 sierpnia 2011 - 18:32 | Permalink

    Z całym szacun­kiem, ale samo użycie konwen­cji nazew­nic­twa PSR-0 to jest speł­nia­nie normy. JEDNEJ. Rozsze­rza­nie hierar­chii wyjąt­ków… tja, jesz­cze fajnie by było, jakby popraw­nie jej użyli. Rzuca­nie LogicException przy błędzie, który ewident­nie jest runtime jest co najmniej zastanawiające.

    Prawdę mówiąc poza dużą liczbą możli­wych do wyko­rzy­sta­nia testów nie widzę tu nic nadzwy­czaj­nego. Idio­tyczne budo­wa­nie obiek­tów — po pięcio­mi­nu­to­wym listingu dalej nie do końca łapię, jak właści­wie mogę dostać jakiś obiekt.

    Co do sensow­no­ści samych testów, to trzeba by je w praniu przetestować.

  • Alexandre
    14 października 2011 - 22:50 | Permalink

    (sorry for post­ing in English!)

    Thanks for this blog post! I’m one of the deve­lo­pers for Respect\Validation and it’s always nice to see some­one testing it, using it and so on.

    I do agree with most of the issues you and Zyx mentio­ned. We have to embrace some trade-offs when deve­lo­ping the project and some of them are chasing our tails right now.

    Perhaps the scariest is our excep­tion model, but we couldn’t figure out a better appro­ach to that. I’d love to see a deeper analy­sis on that.

    As for the v::attribute() and private property access, is possi­ble to use v::call() to get the value thro­ugh a getter method.

    Let me know if I can help you with anything. Thank you again!

    Greetings from Brazil.

  • Dodaj komentarz

    Twój adres e-mail nie zostanie opublikowany.

    Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <p> <pre lang="" line="" escaped=""> <q cite=""> <strike> <strong>