![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 1 640 Pomógł: 28 Dołączył: 13.02.2003 Skąd: Międzyrzecz/Poznań Ostrzeżenie: (0%) ![]() ![]() |
Jak optymalnie i bardziej uniwersalnie sprawdzac dane w kontrolerach (data input)?
Pisanie kontrolerow na zasadzie:
Sprawdzanie tego w kazdym kontrolerze i w jego kazdej metodzie mija sie z celem, jak to rozwiazac inaczej? -------------------- PHP Developer
"Nadmiar wiedzy jest równie szkodliwy jak jej brak" Émile Zola |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Przez kontrole typów argumentów <lol> sorry nie ma tego w PHP dla typów podstawowych, bo mija się to z ideologią twórców ;]
Ja zawsze robiłem
czy raczej is_int(), taka kontrola czy wszystko jest ok. Na wydajność nie patrzyłem, wolę aby działało poprawnie, a wydajność można zyskać optymalizując coś co ma większy kosz czasowy. -------------------- Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami. |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 1 640 Pomógł: 28 Dołączył: 13.02.2003 Skąd: Międzyrzecz/Poznań Ostrzeżenie: (0%) ![]() ![]() |
Wiem, sa rozne rodzaje funkcji.
Problem polega na tym ze jest to powtarzanie kodu co jest nie zgodne z programowaniem OOP i zasada DRY Czesto tych instrukcji if jest duzo, co lubie, bo dokladnie user dostaje komunikat czego brakuje/co zle zrobil itp. -------------------- PHP Developer
"Nadmiar wiedzy jest równie szkodliwy jak jej brak" Émile Zola |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 487 Pomógł: 7 Dołączył: 7.01.2004 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Kontrola danych wejściowych w miarę możliwości powinna być poza ciałem akcji. Jakkolwiek nie zależy zapominać że to konkretna akcja determinuje nam warunki walidacji.
Warunki typu czy to liczba, czy to jest wymagane i tak dalej można wyodrębnić do klas, które załatwią nam walidację. Jak zwykle w takim przypadku zaczynamy od interfejsu:
Dobrze, teraz jak może wyglądać definicja kontekstu walidacji:
Dobra, dorzućmy do tego jeszcze wiadomość:
Może wydawać się dziwne to, że robię interfejs do takiego banału, aczkolwiek mam jeden cel:
Dobra, wiadomości wiadomościami, ale przecież nie jest to najistotniejsze, najbardziej przecież nas interesuje powiązanie tego wszystkiego - czyli jak akcja "się waliduje". Zasadniczo znowu byłbym za interfejsem:
Mając takie definicje front controller, który ma podniesiony ValidationContext może rozróżnić co zrobić - czyli najpierw sprawdza czy akcja wymaga autoryzacji - jeśli tak sprawdza uprawnienia, następnie weryfikuje czy dane, które przychodzą są ok. Teraz rzecz zasadnicza - czyli co z konfiguracją. Jak widać same walidatory to pestka - ale jak zrobić to ładnie. No więc - może przykładowa implementacja:
No i na końcu akcja
Aa i jeszcze walidatory:
Kilka uwag odnośnie kodu, który jest wyżej .. przede wszystkim walidatory dodają wiadomości - równie dobrze mogą bronić się wyjątkami, aczkolwiek mamy wówczas problem ze sformułowaniem komunikatu dla użytkownika. Można zatem rozważyć dwie opcje - wydelegować formatowanie wiadomości z AbstractMessage do ValidationContext - wówczas zmieniły by się nam sygnatury metod addError, addNotice. Druga opcja to przesunąć formatowanie wiadomości do akcji. Dlaczego dodałem coś takiego jak notice w walidacji? Są to informacje, które nie wywalają całego procesu, a które można wyświetlić przy ponownym wyświetlaniu błędu - powiedzmy ktoś nie podał wartości w wymaganym polu a w innym gdzie był powinien trafić float dostaliśmy int - dodajemy notice o konwersji. Aaa i jeszcze walka z tworzeniem walidatorów:
No i kolejna ciekawa wariacja nad którą można pomyśleć:
Kod który przedstawiłem nie jest ani kompletny ani nadzwyczajnie spójny. Może stanowić podstawę do rozpoczęcia prac, aczkolwiek pozostaje jeszcze kilka problemów, które wymagają niezłej gimnastyki. ![]() -------------------- Łukasz Dywicki
Independent Java and open source software consultant. Blog - Java, OSGi, integracja oprogramowania.. |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
No tak jak zwykle czegoś nie doczytałem ;]
Bo ja nie o tej kontroli pisałem, tylko już "wewnętrznej"... @splatch Znów spore ilości kodu umieszczasz ![]() -------------------- Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami. |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 487 Pomógł: 7 Dołączył: 7.01.2004 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
@splatch Znów spore ilości kodu umieszczasz ![]() @Sedziwoj odpowiedzi na forum to obecnie mój jedyny sposób na utrzymanie kontaktu z PHP, stąd tak duże ilości kodu. Myślę też, że takie przykłady z wykorzystaniem interfejsów, abstrakcji i tak dalej są jak najbardziej na miejscu i pomagają odwiedzającym bardziej niż mega rozwlekłe opisy i dywagacje. ![]() ![]() -------------------- Łukasz Dywicki
Independent Java and open source software consultant. Blog - Java, OSGi, integracja oprogramowania.. |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Wież tylko że dywagacje i rozwlekłe opisy się rozumie czytając, ty jednak przy kodzie trzeba chwilę pomyśleć zanim się zrozumie założenia twórcy. Choć ciągle mi się przypomina "witaj świecie" w wzorcach projektowych, czyli aby gdzieś przypadkiem forma nie przerosła treść. Tak jak dziś od dłuższego czasu napisałem coś w pełni proceduralne, ale nie widzę sensu aby dla 3 linijek jednokrotnego wykorzystania (coś do obliczeń dla koleżanki) pisać więcej.
Ale zawsze patrzenie co inni tworzą jest przydatne, tego nie krytykuję ![]() Tak z grubsza przed snem przejrzałem, na pewno są nieścisłości w tym kodzie, ale ogólną koncepcję chyba załapałem. Po prostu rozdzielenie funkcjonalności i umożliwienie stosowania różnych wariantów. A jeszcze co do łączenia walidatorów warunkami, to ja chyba był bym za zdefiniowaniem, które połączyć i jako trzeci argument jaki warunek pomiędzy nimi. Do tego wartości 'notice' (w StackEntry()) zastąpił bym stałą, podobnie ten trzeci argument, warunek złączenia, walidatorów też jako stałą w obiekcie (czy interfejsie, już tego nie będę rozstrzygał :]) No dobra mykam spać. Edit takie tam przecinki, kropi i tak pewnie kiepskie jest to co napisałem Ten post edytował Sedziwoj 5.12.2007, 00:51:17 -------------------- Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami. |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 487 Pomógł: 7 Dołączył: 7.01.2004 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Tak, zasadniczo skłaniając się w stronę opisu.
Validator element zajmujący się walidacją, dostaje kontekst i z niego musi wyciągnąć to, czego potrzebuje i przeprowadzić walidację. Kwestia konfiguracji walidatora - albo przez akcesory albo przez konstruktory. ValidationContext zawiera informacje na temat całego procesu. Ma również zgromadzone dane wejściowe i udostępnia je walidatorom. FrontController element, który nie jest tu widoczny, a który zasadniczo odpowiada za odpalenie akcji i zweryfikowanie czy wszystko "ok", innymi słowy robi $action->validate($this->validationContext), $this->validationContext->isPassed() - gdy dostajemy false podejmuje odpowiednie działania - jakie to zależy już od implementacji. ValidationRequiredAction typ, który sugeruje FrontControllerowi, że dana akcja chciałaby otrzymywać dane, które były zweryfikowane. Jest to tylko interfejs, pod spodem możemy w różny sposób dodawać do kontekstu swoje walidatory. Mogą być one odczytane z XML, mogą być wpisane z palca. Co kto woli. I18nValidationContext kontekst dostarczający "tłumaczenia". I18nMessage wiadomość, która zostanie przetłumaczona, przekazujemy do konstruktora klucz, na podstawie którego z kontekstu zostanie pobrana odpowiednia wiadomość. OrValidationCondition walidator prezentujący prosty warunek logiczny, to lub to. Jesteśmy wolni od problemów związanych z tym, że przychodzi nam raz to raz to. -------------------- Łukasz Dywicki
Independent Java and open source software consultant. Blog - Java, OSGi, integracja oprogramowania.. |
|
|
![]()
Post
#9
|
|
![]() Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. ![]() |
@splatch - w jaki sposób ładujesz (fizycznie) taką ilość interfejsów? Przeanalizowałem Twoje ostatnie posty i tak sobie pomyślałem, że starałem się unikać interfejsów na rzecz abstrakcji również z tego powodu, że autoloader w końcu by wymiękł ;p
Pozdrawiam. -------------------- To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness; chaotic, confused, vulnerability, to inform yourself. Think for yourself. Question authority. |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
@Cysiaczek
Nie przesadzaj dla autoloader'a to nie jest kłopot, gorzej tylko z nazewnictwem ;] -------------------- Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami. |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 487 Pomógł: 7 Dołączył: 7.01.2004 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
@splatch - w jaki sposób ładujesz (fizycznie) taką ilość interfejsów? Przeanalizowałem Twoje ostatnie posty i tak sobie pomyślałem, że starałem się unikać interfejsów na rzecz abstrakcji również z tego powodu, że autoloader w końcu by wymiękł ;p Kod piszę na poczekaniu, na potrzeby poszczególnych postów. Wydaje mi się, że interfejsy w tym przypadku nie są problematyczne, są małe i lekkie, część z nich zawiera tylko po parę metod. Co do optymalizacji autoloadera - w Mojavi 3 metoda była prosta - stworzenie pliku z definicjami wszystkich wymaganych interfejsów etc. Wczytywany był 1 plik a nie kilka. -------------------- Łukasz Dywicki
Independent Java and open source software consultant. Blog - Java, OSGi, integracja oprogramowania.. |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 1 640 Pomógł: 28 Dołączył: 13.02.2003 Skąd: Międzyrzecz/Poznań Ostrzeżenie: (0%) ![]() ![]() |
Dobra dobra, bo troche odbiegacie od tematu...
To co splatch wklepal jest troche za bardzo przesadzaone, pytanie brzmialo jak z zasada DRY robic kontrole danych wejsciowych, tzn. jak nie powtarzac sie sprawdzajac dane z parametrow metody, takich jak id, liczba, string, itp -------------------- PHP Developer
"Nadmiar wiedzy jest równie szkodliwy jak jej brak" Émile Zola |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 487 Pomógł: 7 Dołączył: 7.01.2004 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
To co splatch wklepal jest troche za bardzo przesadzaone, pytanie brzmialo jak z zasada DRY robic kontrole danych wejsciowych, tzn. jak nie powtarzac sie sprawdzajac dane z parametrow metody, takich jak id, liczba, string, itp Jeśli przykład kodu, który jest wyżej koliduje z DRY to proszę pokaż mi gdzie. Być może źle rozumiem to pojęcie i gdzieś popełniłem błąd. Ewentualnie powiedz co w moim przykładzie odbiega od Twoich oczekiwań. -------------------- Łukasz Dywicki
Independent Java and open source software consultant. Blog - Java, OSGi, integracja oprogramowania.. |
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 1 640 Pomógł: 28 Dołączył: 13.02.2003 Skąd: Międzyrzecz/Poznań Ostrzeżenie: (0%) ![]() ![]() |
No stworzylem sobie cos na ten wzor, ale duzo duzo mniej kodu, tzn. z czasem bedzie to sie rozrastalo
Beda problemy, beda pytania ![]() -------------------- PHP Developer
"Nadmiar wiedzy jest równie szkodliwy jak jej brak" Émile Zola |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 03:00 |