Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: walidacja błędów
Forum PHP.pl > Forum > PHP > Object-oriented programming
dantekir
Witam,

Potrzebuję pomocy w zrozumieniu w jaki sposób kontrolować dane wejściowe w odpowiednich klasach.
Dopiero raczkuję z obiektowym więc porszę o wyrozumiałość...

Stworzyłem interfejs Validator z funkcją validate()
Interfejs jest zaimplementowany w klasie PropertyObject która wygląda tak:

  1. <?php
  2. abstract class PropertyObject implements Validator
  3. {
  4.  
  5.  /** Aggregations: */
  6.  
  7.  /** Compositions: */
  8.  
  9.   /*** Attributes: ***/
  10.  
  11.  /**
  12.    *
  13.    * @access protected
  14.    */
  15.  
  16.  protected $propertyTable =array ();
  17.  protected $changedProperties= array();
  18.  protected $data;
  19.  protected $errors = array();
  20.  
  21.  
  22.  public function __construct($arData){
  23.      $this->data=$arData;
  24.  }
  25.  
  26.  function __get($propertyName){
  27.      if(!array_key_exists($propertyName, $this->propertyTable))
  28.            throw new Exception("Błędna własność \"$propertyName\"!");
  29.  
  30.      if(method_exists($this, 'get'.$propertyName)){
  31.          return call_user_func(array($this, 'get'.$propertyName));
  32.      } else {
  33.          //print ('nie ma funkcji '.$propertyName.'<br>');
  34.          return $this->data[$this->propertyTable[$propertyName]];
  35.      }
  36.  }
  37.  
  38.  function __set($propertyName, $value){
  39.      if(!array_key_exists($propertyName, $this->propertyTable))
  40.        throw new Exception("Błędna własność \"$errors[$propertyName]\"");
  41.      if(method_exists($this, 'set'.$propertyName)){
  42.          return call_user_func(
  43.              array($this,'set'.$propertyName),
  44.              $value
  45.          );
  46.      } else {
  47.          //jeżeli wartość własności uległa zmianie i nie ma jej
  48.          //jeszcze w tabeli chengedProperties, zostanie do niej dołączona
  49.          if($this->propertyTable[$propertyName]!=$value &&
  50.              !in_array($propertyName,$this->changedProperties)){
  51.                $this->changedProperties[]=$propertyName;
  52.              }
  53.          $this->data[$this->propertyTable[$propertyName]] = $value;
  54.      }
  55.  }
  56.  
  57.  
  58.  /**
  59.    *
  60.    *
  61.    * @return
  62.    * @access public
  63.    */
  64.  function validate( ) {
  65.      
  66.  } // end of member function validate
  67.  
  68. } // end of PropertyObject
  69. ?>



Dziedziczę klasę w konkretnym obiekcie np:

  1. <?php
  2. class WareHouse extends PropertyObject
  3. {
  4.  
  5.  /** Aggregations: */
  6.  
  7.  /** Compositions: */
  8.  
  9.   /*** Attributes: ***/
  10.  
  11.  /**
  12.    *
  13.    * @access private
  14.    *  
  15.   private $entity = array();
  16.   private $id_warehouse;
  17.    */
  18.    private $category = array();
  19.  
  20.  
  21.  public function __construct($id_warehouse){
  22.      $this->propertyTable['WareHouseID']=$id_warehouse;
  23.  }
  24.  
  25. ....
  26.  
  27.  public function validate(){
  28.      if(!$this->WareHouseID){
  29.          $this->errors['WareHouseID']='Brak id dla magazynu';
  30.      }
  31.      if(sizeof($this->errors)){
  32.          return false;
  33.      } else {
  34.          return true;
  35.      }
  36.  }
  37.  
  38.  
  39. } // end of WareHouse
  40. ?>


Do tablicy errors[] zbieram informacje o ewentualnych błędach.
Przykład jest przerobiony z książki niestety nie mam tam informacji jak w tym przykładzie wyciągnąć dane z tej tablicy - w przypadku gdy nie jest ona pusta.

Dodam, że mam inne klasy które w zasadzie składają się na obiekt WareHouse i tam również implementuję funkcję validate()
Pytanie które mnie gnębi to jak tego użyć? Tak aby w przypadku wprowadzenia błędnych danych pojawiała się odpowiednia informacja.
-=Peter=-
Przykładowo:

  1. <?php
  2. abstract class PropertyObject implements Validator{
  3.  //ciach
  4.  public function hasErrors(){
  5.    return (count($this->errors) > 0);
  6.  }
  7.  
  8.  public function getErrors(){
  9.    return $this->errors;
  10.  }
  11. }
  12.  
  13. $o = new ...;
  14. if($o->hasErrors()){
  15.  foreach($o->getErrors() as $key => $error){
  16.    //wyświetlanie błędów
  17.  }
  18. }
  19.  
  20. //nie wiem czy o to chodzi dokładnie
  21. class WareHouse extends PropertyObject{
  22.  //ciach
  23.  public function validate(){
  24.    //walidacja obiektów category (zakładam że też rozszerzają PropertyObject)
  25.    foreach($this->category as $category){
  26.      $category->validate();
  27.      if($category->hasErrors()){
  28.        //dodanie informacji o błędzie
  29.        $this->errors = array_merge($this->errors, $category->getErrors());
  30.      }
  31.      //ustawienie błędów tego obiektu
  32.    }
  33.  }
  34. }
  35.  
  36. //lub ewentualnie
  37. class WareHouse extends PropertyObject{
  38.  //ciach
  39.  public function validate(){
  40.    //walidacja obiektów category (zakładam że też rozszerzają PropertyObject)
  41.    foreach($this->category as $category){
  42.      $category->validate();
  43.    }
  44.    //ustawienie błędów tego obiektu
  45.  }
  46.  
  47.  public function hasErrors(){
  48.    $has = parent::hasErrors();
  49.    if($has) return true;
  50.    foreach($this->category as $cat){
  51.      if($cat->hasError()){
  52.        $has = true;
  53.        break;
  54.      }
  55.    }
  56.    return $has;
  57.  }
  58.  
  59.  public function getErrors(){
  60.    $errors = $this->errors;
  61.  
  62.    foreach($this->category as $category){
  63.      if($category->hasErrors()){
  64.        //dodanie informacji o błędzie
  65.        $errors = array_merge($errors, $category->getErrors());
  66.      }
  67.  }
  68. }
  69. //bardziej wydajny jest sposób pierwszy, czyli dodawanie ewentualnych błędów z obiektu składowego do obiektu
  70. //nadrzędnego bezpośrednio po walidacji
  71. ?>
dantekir
prawdę mówiąc to trochę skomplikowane to co napisałeś - przynajmniej dla mnie smile.gif
rozwiązałem swój problem w ten sposób że w każdej klasie mam validate() która zbiera do tablicy errors informacje o błędach i zwraca true lub false w zależności czy tablica zawiera elementy a żeby je wypisać dodałem jedynie do PropertyObject getErrors();
I jak tak teraz sobie pomyślę o tym to aż mi wstyd że w ogóle pytałem... smile.gif
Mimo wszystko dzięki za pomoc, a swoją drogą to temat walidacji danych przy tworzeniu obiektu bardzo mnie interesuje i jestem ciekaw jakie Wy macie uniwersalne i sprawdzone rozwiązania.
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.