Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Validująca klasa
Forum PHP.pl > Inne > Oceny
szmerak
  1. <?php
  2. class Validate {
  3.  
  4. private $text = null;
  5.  
  6. private $methods = array();
  7.  
  8. private $result = null;
  9.  
  10. public function do_validate($text, $methods)
  11. {
  12. if(sizeof($methods) < 1)
  13. { return false; }
  14. $this->methods = (array) $methods;
  15. $this->text = $text;
  16. if(array_key_exists("MAX_LENGHT", $this->methods) and array_key_exists("MIN_LENGHT", $this->methods))
  17. {
  18. $max_lenght = intval($this->methods["MAX_LENGHT"][0]);
  19. $min_lenght = intval($this->methods["MIN_LENGHT"][0]);
  20. if($max_lenght <= $min_lenght)
  21. {
  22. exit("You have screwed up something with setting. Check them again");
  23. }
  24. }
  25. foreach($this->methods as $k => $v)
  26. {
  27. switch(strtolower($k))
  28. {
  29. case 'empty':
  30. if(empty($text) or $text == "" or !isset($text))
  31. {
  32. $this->result[] = $v;
  33. }
  34. break;
  35. case 'max_lenght':
  36. if(is_array($v))
  37. {
  38. if(is_numeric($v[0]))
  39. {
  40. $param["lenght"] = intval($v[0]);
  41. }else{
  42. exit("First param of array must be numeric");
  43. }
  44. $param["alert"] = $v[1];
  45. } else {
  46. exit("Second param must be an array");
  47. }
  48. if(strlen($this->text) > $param["lenght"])
  49. {
  50. $this->result[] = $param["alert"];
  51. }
  52. break;
  53. case 'min_lenght':
  54. if(is_array($v))
  55. {
  56. if(is_numeric($v[0]))
  57. {
  58. $param["lenght"] = intval($v[0]);
  59. }else{
  60. exit("First param of array must be numeric");
  61. }
  62. $param["alert"] = $v[1];
  63. } else {
  64. exit("Second param must be an array");
  65. }
  66. if(strlen($this->text) < $param["lenght"])
  67. {
  68. $this->result[] = $param["alert"];
  69. }
  70. break;
  71. }
  72. }
  73. }
  74. public function get_results()
  75. {
  76. return $this->result;
  77. }
  78.  
  79. }
  80. ?>


Przedstawiam wam moją walidującą klase i chciał bym ją użyć do mojego przyszłego CMS.
z czasem dodam validating emaila itp... ale jak narazie tyle zostanie co powiecie na jej temat?
co byscie zmienili dodali itp?
Sposob uzycia
  1. include 'class.validate.php';
  2. $val = new Validate;
  3. $validate = array(
  4. 'EMPTY' => "field can not be empty",
  5. 'MAX_LENGHT' => array('30', "This string is too big"),
  6. 'MIN_LENGHT' => array('29', "This string is too short"),
  7. );
  8. $val->do_validate("JAKIS TEKST NIE SPELNIAJACY WARUNKU", $validate);
  9. var_dump($val->get_results());
cudny
Nie chce mi się całości patrzeć, wybacz tongue.gif
Rażące uwagi:
1. Brak obiektowości - po co ci klasa z jedną metodą robiącą "wszystko" ? Przez to już więcej jej nie wykorzystasz. Powinny być metody powiedzmy takie jak $validate->between($min,$max,$res); która po daniu argumentów: $min = 3, $max = 6, $res = ? zwróci true jeśli $res zawiera się pomiędzy $min i $max czyli pomiędzy 3 a 6 i metody takie wykorzystywane dalej.
32 if(empty($text) or $text == "" or !isset($text)) - jeśli na serwerze masz włączone error_reporting to wywali ci wyjątek, że $text is not exist biggrin.gif poza tym po co sprawdzać czy coś jest puste i lub "" ? KOLEJNOŚĆ WARUNKÓW SIĘ LICZY ! powinno być tak: if(!isset($text) || empty($text)) return false; wtedy nawet jeśli $text nie istnieje to warunek już nie przejdzie dalej i nie sprawdzi czy $text is empty - także nie wywali ci wyjątku

Idę spać smile.gif nie jestem od sprawdzania poprawności kodu smile.gif musisz poczytać o obiektowości (najlepiej naucz się frameworka, polecam Zend'a, one wymuszają obiektowość) i popracuj na serwerze, który wywala każdy błąd - będziesz wiedział jak wyłapywać wyjątki i kiedy warunki się spełniają smile.gif
Kliknij pomógł, dobranoc biggrin.gif


Jezu...
A po co ci sprawdzenie po sobie czy coś istnieje ?
if(array_key_exists("MAX_LENGHT", $this->methods) and array_key_exists("MIN_LENGHT", $this->methods))

Ogólnie $methods moim zdaniem nie powinna być array'em
Użyj pól:
  1. protected $_min_len = 0;
  2. protected $_max_len = 0;

I daj do nich metody:
  1. public function setMin($min) {
  2. $min = intval($min);
  3. if($min < 1) return false;
  4. $this->_min_len = $min;
  5. }
  6.  
  7. public function setMax($max) {
  8. $max = intval($max);
  9. if($max < 1) return false;
  10. $this->_max_len = $max;
  11. }


I pamiętaj, DRY - Dont Repeat Yourself
szmerak
pomyśle nad tym.
Dzięki za odpowiedź o coś takiego mi chodziło

Cytat(cudny @ 4.11.2011, 23:12:22 ) *
Jezu...
A po co ci sprawdzenie po sobie czy coś istnieje ?
if(array_key_exists("MAX_LENGHT", $this->methods) and array_key_exists("MIN_LENGHT", $this->methods))

Tutaj nie sprawdzam czy istnieje. Tylko czy w 1 walidacji 2 metody są ustawione i działają z sensem. Bo trochę głupio by było gdybym ustawił: max_len = 30 min_len = 40 , to nie ma sensu; linijka wyzej poinformuje mnie o tym ze cos spiepszylem...

Cytat(cudny @ 4.11.2011, 23:12:22 ) *
I pamiętaj, DRY - Dont Repeat Yourself

Jesli chodzi o to, to nie zaczailem tongue.gif ?
to że kod wygląda podobnie w max_len / min_len tongue.gif?
skowron-line
Ja Ci proponuje napisać klasę która będzie odwoływała się do zewnętrznych Helperów a sama zawierała by tylko metody typu add i check
  1. class validate {
  2. /*
  3.   validator - nazwa helpera lub funkcji natywnej
  4.   field - pole lub string do sprawdzenia
  5.   */
  6. public function add($validator, $field){}
  7. /*
  8.   sprawdza wszystkie warunki
  9.   zwraca true/false
  10.   */
  11. public function check(){}
  12. }

Zobacz sobie jak to jest w FW rozwiązane
http://kohanaframework.org/3.0/guide/api/Validate
http://framework.zend.com/manual/en/zend.validate.html

przykłady znajdziesz w sieci.
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.