Autor wpisu: Śpiechu, dodany: 09.08.2011 23:25, tagi: php
W dzisiejszym odcinku weźmie udział „najwspanialszy z kiedykolwiek stworzonych silnik do walidacji danych w PHP” — Validation. Projekt rozwija groźnie brzmiąca grupa programistów o nazwie Respect z Brazylii. Mam nadzieję, że po tym wpisie nie wyląduję w lesie wyciągnięty z bagażnika jakiegoś starego Mercedesa…
Projekt spełnia normy, które są oczywiste przy czytaniu kodu takich gigantów jak Zend Framework 2 czy Symfony, a więc używanie namespaces, drzewiasta struktura klas i katalogów, kompatybilność ze standardowym autoloaderem klas SplClassLoader, własne rozszerzenia wyjątków. Jedyny zgrzyt to poziom dokumentacji. Automat raczej nie da rady w pełni wygenerować typów parametrów metod i zwracanych wartości. W nagrodę za to dostępnych jest dziesiątki testów jednostkowych. Co jak co, ale walidator sprawdzający czyjeś dane sam powinien być gruntownie sprawdzony
Powszechnie wiadomo, że w PHP nie można użyć konstrukcji typu
new Obiekt()->metoda();
Zamiast tego można stosować metody statyczne, które w rezultacie zwrócą nam obiekt lub też można zastosować tak lubianego przez was Harrego Pottera. Twórcy biblioteki czarują często i gęsto.
Autorzy Validation proponują używanie w następują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);
Warunków, które możemy sprawdzać jest kilkadziesiąt. Można popatrzeć po plikach. Z ciekawszych to wymieniony wyżej
between()
dla zakresu znaków,
in(array('wartosc1' , 'wartosc2))
dla dozwolonych wartości oraz konstrukcja
v::each(v::warunek())->validate(array('wartosc1','wartosc2'));
dla sprawdzenia wszystkich wartości w tablicy. Ponadto można tworzyć kompozyty różnych warunków za pomocą
v::allOf($walidator1,$walidator2);
(jeżeli wszystkie muszą przejść) oraz