Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [klasa] kontroler żądań
Forum PHP.pl > Inne > Oceny
dyktek
Witam, napisałem ostatnio kontroler żądań, na razie wyłapuje dane GET i POST oraz filtruje dowolnie wybrane klucze lub wszystkie klucze. Zalezy mi raczej na tym zeby ktos spojrzał na to okiem fachowca smile.gif wiec wklejam to do tego działu

  1. <?php
  2. /* 
  3. @ KONTROLER
  4. @dyktek/hadzia...
  5. -------------------------------------------------INFO------------------------------------------------------------
  6. @ $oKon = new kontroler;
  7. @ $oKon->exclute('pole', 'pole2') - pola, ktore maja byc pominiete przy filtrowaniu danych
  8. @ $oKon->prepare();
  9. @ ?index.php?module=artykuly&pole=dyktek&id=23
  10. @ ### wartosc module ### - okresla modul, ktory bedzie zaladowany
  11. @ pozostale klucze moga byc dowolne
  12. --------------------------------------------------------------------------------------------------------------------
  13. @@@ CHANGE LOG @@@
  14. - start 27.05.06
  15. - ukonczona wersja 0.1.9
  16. */
  17.  
  18. class kontroler
  19. {
  20. protected $aGet = array();
  21. protected $aPost = array();
  22.  
  23. /* tablica z polami wykluczonymi 
  24. przy sprawdzaniu */
  25. protected $aExcluteItem = array();
  26.  
  27. /* tablica z nazwami pol 
  28. ktore maja zostac sprawdzone
  29. pod katem nieprawidlowych znakow*/
  30. protected $aClean = array();
  31.  
  32. /* tablica zawierajaca pola do ktorych 
  33. wprowadzono niedozwolone znaki */
  34. protected $aIncorrectRequest = array();
  35.  
  36. /* nazwa katalogu z modelami */
  37. protected $sDir = 'model';
  38.  
  39. /* wyrazenie z niechcianymi (niedozwolonymi) znakami */
  40. protected $regExp = '/('|")/';
  41.  
  42.  
  43. public function __construct(){
  44. $this->aGet = $_GET;
  45. $this->aPost = $_POST;
  46. }
  47.  
  48. /* czy klucz istnieje w tablicy */
  49. private function key_exists($sKey, $aTab){
  50. if(array_key_exists($sKey, $aTab)) 
  51. return true; 
  52. else 
  53. return false;
  54. }
  55.  
  56. /* czy klucz module przenosi prawidlowa nazwe */
  57. private function valid_module($aTab){
  58. if($this->key_exists('module', $aTab)){
  59. if(preg_match('/^(w+)$/', $aTab['module']))
  60. return true;
  61. else
  62. return false;
  63. }
  64. }
  65.  
  66. /* czy istnieje model */
  67. private function is_module($aTab){
  68. $file_dir = ''.$this->sDir.'/'.$aTab['module'].'.php';
  69. if(file_exists($file_dir))
  70. return true;
  71. else
  72. return false;
  73. }
  74.  
  75. /* @ prepare_array($aTab)
  76. @ usuwa z tablicy ktora jest transportowane zadanie
  77. @ pola, ktore maja byc pominete przy sprawdzaniu
  78. @ pola te transportowane sa w tablicy $this->aExcluteItem
  79. @ w/w tablica jest tworzona przez metode exclute
  80. */
  81. private function prepare_array($aTab){
  82. foreach($this->aExcluteItem as $sValue){
  83. foreach($aTab as $key => $value){
  84. if($sValue != $key)
  85. $aNewArray[$key] = $value;
  86. }
  87. unset($aTab);
  88. $aTab = $aNewArray;
  89. unset($aNewArray);
  90. }
  91. $this->aClean = $aTab;
  92. $iStart = 0;
  93.  foreach($this->aClean as $key => $value){
  94. $aNewArray[$iStart++] = $key;
  95.  }
  96.  unset($this->aClean);
  97.  return $this->aClean = $aNewArray;
  98. }
  99.  
  100. /* @ check_values($aArray, $sMethod)
  101. @ metoda sprawdza elementy tablicy pod katem
  102. @ niedozwolonych znakow, ktore sa definiowane w $this->regExp
  103. */
  104. private function check_values($aArray, $sMethod){
  105. $aSource = $this->prepare_array($aArray);
  106. $iA = 0;
  107. for($i = 0; $i < count($aSource); $i++){
  108. if(preg_match($this->regExp, $aArray[$aSource[$i]])){
  109. $this->aIncorrectRequest[$aSource[$i]] = $aArray[$aSource[$i]];
  110. $this->aIncorrectRequest[$iA++] = $aArray[$aSource[$i]];
  111. }
  112. }
  113. return $this->aIncorrectRequest;
  114. }
  115.  
  116. /* @ exclute()
  117. @ metoda tworzy tablice z polami
  118. @ ktore maja zostac pominiete przy 
  119. @ sprawdzaniu pod katem niedozwolonych zankow
  120. */
  121. public function exclute(){
  122. $iArgs = func_num_args();
  123. $this->aExcluteItem = func_get_args();
  124. return $this->aExcluteItem;
  125. }
  126.  
  127. /* @ prepare()
  128. @ metoda zwraca jako tablice
  129. @ informacje o wszystkich zadaniach
  130. @ oraz informacje o zadaniach, ktore
  131. @ w zawieraja niedozwolone znaki
  132. */
  133. public function prepare(){
  134. if(count($this->aGet) > 0){
  135. if($this->valid_module($this->aGet)){
  136. if($this->is_module($this->aGet))
  137. return array($this->aGet['module'] ,$this->aGet ,$this->check_values($this->aGet, '$_GET'));
  138. else
  139. throw new Exception('nie ma takiego modulu');
  140. } else {
  141. throw new Exception('nieprawidlowa nazwa modulu');
  142. }
  143. elseif(count($this->aPost) > 0){
  144. if($this->valid_module($this->aPost)){
  145. if($this->is_module($this->aPost))
  146. return array($this->aPost['module'], $this->aPost ,$this->check_values($this->aPost, '$_POST'));
  147. else
  148. throw new Exception('nie ma takiego modulu');
  149. } else {
  150. throw new Exception('nieprawidlowa nazwa modulu');
  151. }
  152. }
  153. }
  154.  
  155. $oKon = new kontroler();
  156.  
  157. $oKon->exclute('module', 'id');
  158.  
  159. try {
  160. $dane = $oKon->prepare();
  161. echo'<pre>';
  162. print_r($dane);
  163. echo'</pre>';
  164. }
  165. catch(Exception $e) {
  166. echo $e->getMessage();
  167. }
  168. ?>
bigZbig
Dobrze kombinujesz, ale popełniłeś błędy już na etapie założeń teoretycznych. Pomijam zbyt ogólnikową nazwę klasy - w końcu kontrolerów możesz napisać całą masę, ale przydałoby się w nazwie zazanaczyć przynajmniej co to za kontroler. Wracając do błędów w założeniach. Napisałeś coś co jest mixem klasy odpowiedzialnej za odbiór danych od uzytkownika i wstępną ich walidacją zwykle nazywanej Requestem i dyspozytora - Dispatcher - zajmującego się obsługą żadań, wydarzeń lub akcji (zależy jak się to nazwie).

Dyspozytor, który jak rozumiem był Twoim głównym celem powinien otrzymywać jedynie zmienną która zawiera lub może zawierać żadanie. Następnie powinien sprawdzić czy potrafi obsłużyć to żądanie (zdarzenie lub akcję) i czy użytkownik, który dane żądanie przesłał ma do tego prawo. Jeśli dyspozytor nie znajdzie klasy lub metody odpowiedzialnej za obsługę danego zdarzenia lub stwierdzi tę akcję za nieuprawnioną musi jakoś zareagować np. zgłaszając wyjątek lub wykonująć akcję domyślną i dokonując odpowiedniego wpisu w logu. Warto też się zastanowić czy nie zastosować w tym przypadku wzorca singelton.

W zadnym wypadku dyspozytor nie powinien pobierać całej tablicy $_POST i $_GET i szukać w nich zmiennej zawierającej żadanie. Wstępną filtracją danych powinna zajmować się, jak już o tym wspomniałem inna klasa, która oprócz tablic $_POST i $_GET powinna też brać pod uwagę $_COOKIE. Niekiedy do wstępnej walidacji przydają się też informacje z tablicy superglobalnej $_SERVER lub z sesji. Przeczytaj np. Aplikacja php – system wejścia.

Inne uwagi.
Widze, że stosujesz notację węgierską, ale zdarza Ci się o tym zapominać winksmiley.jpg
  1. <?php
  2. $file_dir = ''.$this->sDir.'/'.$aTab['module'].'.php';
  3. ?>


Poważniejszą przypadłością jest sposób komentowania. Polecam przyjąć jeden ze standardów np. rodem z phpDocumentatora.
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-2024 Invision Power Services, Inc.