Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Własny validator
Forum PHP.pl > Forum > PHP > Object-oriented programming
aras785
Witam. Zacząłem pisać sobie własny validator danych oto co mam póki co:
  1. <?php
  2. class Validator {
  3. public function __construct($data,$validators) {
  4. foreach($data as $data_key=>$data_value) {
  5. if(array_key_exists($data_key, $validators)) {
  6. if(method_exists($this, $validators[$data_key])) {
  7. if($this->{$validators[$data_key]}($data_value)) {
  8. return true;
  9. }else return false;
  10. }
  11. }
  12. }
  13. }
  14. public function isInt($var) {
  15. if(is_int($var)) {
  16. return true;
  17. }else return false;
  18. }
  19. }
  20.  
  21. $dane = array('wiek'=>2);
  22. $validacja = array('wiek'=>'isInt');
  23.  
  24. if(new Validator($dane,$validacja)) echo 'ok';else echo 'Blad';

Póki co jest prosta zasada ale nie wiem dlaczego w ostatniej linijce gdy sprawdzam if(new Valid...) to zawsze pokazuje 'ok'... Szukam błędu ale niestety nie widzę. Proszę o podpowiedzi. Pozdrawiam
nospor
podstawy..... konstruktor zwraca obiekt, a nie żadne RETURN.... a skoro to jest obiekt, to zawsze w IF da ci logiczne TRUE
Musisz napisać oddzielną metodę, do walidacji i ją wywoływać. Konstruktor to konstruktor - nic więcej
aras785
Dziękuje mistrzu. Zapamiętam na przyszłość. Teraz chodzi:
  1. <?php
  2. class Validator {
  3. public function isValid($data,$validators) {
  4. foreach($data as $data_key=>$data_value) {
  5. if(array_key_exists($data_key, $validators)) {
  6. if(method_exists($this, $validators[$data_key])) {
  7. if(!$this->{$validators[$data_key]}($data_value)) {
  8. return false;
  9. }
  10. }
  11. }
  12. }
  13. return true;
  14. }
  15. public function isInt($var) {
  16. if(is_int($var)) {
  17. return true;
  18. }else return false;
  19. }
  20. }
  21.  
  22. $dane = array('wiek'=>2,'wiek2'=>'asd');
  23. $validacja = array('wiek'=>'isInt','wiek2'=>'isInt');
  24.  
  25. $valid = new Validator;
  26. if($valid->isValid($dane,$validacja)) echo 'ok';else echo 'blad';


@nospor możesz mi coś doradzić ws. walidatora? Co może mi się przydać?
nospor
if(is_int($var)) {
To nie ma sensu. Z forma zawsze dostajesz tekst, nawet jeśli ten tekst jest liczbą. zamiast is_int musisz użyć is_numeric

poza tym Twój walidator zwraca jedynie true lub false dla całości. W jego rezultacie nie wiesz, które pole byłe złe a to niedobrze smile.gif
Crozin
Cytat
@nospor możesz mi coś doradzić ws. walidatora? Co może mi się przydać?
Przede wszystkim przydałoby Ci się przeglądniecie istniejących rozwiązań, np. z Zenda czy Symfony. Następnie możesz się nimi pobawić, wypróbować któryś z nich w jakimś projekcie. Gdy uznasz, że z jakiegoś powodu istniejące systemy nie sprawdzają się, będziesz już wiedział co było z nimi nie tak i będziesz miał możliwość ich rozbudowy o brakujące funkcje. Jeżeli jednak uznasz, że istniejące rozwiązania w ogóle nie sprawdzają się będzie to pierwszy argument za tym by w ogóle brać się za pisanie własnej biblioteki.
aras785
Macie rację lecz chciałem po prostu nauczyć się czegoś. Zend ma fajne rozwiązanie lecz nie potrafię wydobyć je z samego frameworka.

Szybka modyfikacja (brzydki kod - a wszczegolnosci umiejscowienie komunikatow)
  1. <?php
  2. class Validator {
  3. public $errors=array();
  4. public function isValid($data,$validators) {
  5. foreach($data as $data_key=>$data_value) {
  6. if(array_key_exists($data_key, $validators)) {
  7. if(method_exists($this, $validators[$data_key])) {
  8. if(!$this->{$validators[$data_key]}($data_value)) {
  9. $this->errors[$data_key] = $this->komunikat($validators[$data_key]);
  10. }
  11. }
  12. }
  13. }
  14. if(count($this->errors)==0) return true;
  15. return false;
  16. }
  17. public function isInt($var) {
  18. if(is_numeric($var)) {
  19. return true;
  20. }else return false;
  21. }
  22. public function komunikat($valide) {
  23. $lang = array(
  24. 'isInt'=>'To musi byc liczba'
  25. );
  26. return $lang[$valide];
  27. }
  28. public function getErrors() {
  29. return $this->errors;
  30. }
  31. }
  32. $dane = array('wiek'=>'asd');
  33. $validacja = array('wiek'=>'isInt');
  34.  
  35. $valid = new Validator;
  36. if($valid->isValid($dane,$validacja)) echo 'ok';else print_r($valid->getErrors());


Pozdrawiam:)
Crozin
Cytat
Macie rację lecz chciałem po prostu nauczyć się czegoś.
Nie mając minimalnej wiedzy/doświadczenia z danym tematem ciężko jest stworzyć cokolwiek sensownego zaczynając od podstaw. Szczególnie, gdy nawet nie potrafisz jeszcze posługiwać się OOP. Czy się czegoś nauczysz? Pewnie tak: marnowania czasu oraz masy złych nawyków.

Nie odbieraj tego personalnie, ale to co tutaj przedstawiłeś jest pod chyba każdym możliwym względem złe. Na pewnego gorsze od serii IF-ów z echo do wyświetlania błędów.
Cytat
Zend ma fajne rozwiązanie lecz nie potrafię wydobyć je z samego frameworka.
https://github.com/zendframework/Component_ZendValidator
aras785
Wporządku. Dziękuje za wszystkie odpowiedzi. Pozdrawiam smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.