Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [skrypt/klasa]Router
Forum PHP.pl > Inne > Oceny
sazian
Witam,
napisałem skrypt routera i chciałbym się dowiedzieć "co o nim inni myślą" winksmiley.jpg
router ma za zadanie rozbić przyjazny link na tablice(metoda setup)
jeśli zajdzie taka potrzeba sprawdzić czy link pasuje do wzorca (metoda checkRules), jeśli tak to do którego
oraz na koniec "dopasować link do akcji"(useAction)
plik .htacces
Kod
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php?url=$0 [L]

klasa routera (dodałem dwie przykładowe reguły i akcje dla nich)
  1.  
  2. class Router{
  3. public static $url=array();
  4.  
  5. public static $exe='';
  6. public static $rules=array(
  7. array(0=>'^[A-Za-z][A-Za-z0-9]*$',1=>'^[A-Za-z][A-Za-z0-9]*$',2=>'^[0-9]+$','2+'=>'^[0-9]$','5'=>'^[a-z]+$',
  8. 'action'=>array('dir'=>0,'controler'=>1,'method'=>'1+','parms'=>'3+')),
  9. array(0=>'^[A-Za-z][A-Za-z0-9]*$',1=>'^[A-Za-z][A-Za-z0-9]*$',2=>'^[0-9]+$',3=>'^[a-z]$',
  10. 'action'=>array('controler'=>1)),
  11. 'default'=>array('',
  12. 'action'=>array('dir'=>'default_dir','controler'=>'default_controler','method'=>'default_method','parms'=>'any'))
  13.  
  14.  
  15. );
  16. public static $result=array();
  17. public static $debug=false;
  18.  
  19. public function __construct(){
  20.  
  21. }
  22. public static function setup(){
  23. Router::$url=explode('_',trim($_GET['url']));
  24. list(Router::$url[count(Router::$url)-1],Router::$exe)=explode('.',Router::$url[count(Router::$url)-1]);
  25.  
  26.  
  27. }
  28. public static function checkRules(){
  29. $prev=0;//numer poprzedniej reguły
  30. $use=0;//obecnie używana reguła(np 1,1+ ...)
  31. $next=false;//przejście do następnej tablicy reguł
  32. $count=0;//liczba użytych reguł
  33. foreach(Router::$rules as $rule=>$v){//przeszukiwanie tablicy reguł
  34. if($_rule!=='action'){
  35. foreach(Router::$url as $key => $value){//przeszukiwanie adresów
  36. if(isset(Router::$rules[$rule][$key])){//jeśli postać liczbowa...
  37. $prev=$use=$key;
  38. }
  39. else
  40. if(isset(Router::$rules[$rule][$prev.'+'])){//jeśli postać z plusem...
  41. if($use.''==$prev.'+'){
  42. $count--;//jeśli poprawne przejście
  43. }
  44. $use=$prev.'+';
  45. }
  46. if(Router::$debug)echo $rule.'=>'.$use.' : ';
  47. if($i=(!preg_match('/'.Router::$rules[$rule][$use].'/',$value))){//jeśli nie pasuje do wzorca ...
  48. $next=true;//następna tablica regół
  49. if(Router::$debug)echo 'NEXT<hr>';
  50. $prev=$use=$count=0;
  51. break;//wyjście z tablicy regół
  52. }
  53.  
  54. if(Router::$debug)echo 'TRUE c_max '.count(Router::$rules[$rule]).' c '.$count.' i: '.
  55. ((!$i)?'true':'false').'<hr>';
  56. $_count++;
  57. }
  58.  
  59. if($next){//następna tablica reguł
  60. $next=false;
  61. }
  62. if(($_count>=count(Router::$rules[$rule])-1)||($rule==='default')){//jeśli dopasowano wszystkie lub nie dopasowano żadnej
  63. if(Router::$debug)echo 'RETURN: '.$rule;
  64. break;
  65. }
  66. $prev=$use=$count=0;
  67. }
  68. }
  69. return $rule;
  70. }
  71. public static function useAction($_rule){
  72.  
  73. if(Router::$debug)echo '<br><br><hr>ACTION: <br>';
  74. if($_rules!=='default'){
  75. $ref=null;
  76. foreach(Router::$rules['default']['action'] as $key => $value ){
  77. if(isset(Router::$rules[$_rule]['action'][$key])){
  78. if(is_int(Router::$rules[$_rule]['action'][$key])){
  79. if($ref!==null){
  80. $i=Router::$rules[$_rule]['action'][$ref][0];
  81. unset(Router::$rules[$_rule]['action'][$ref][0]);
  82. for($i;$i<=Router::$rules[$_rule]['action'][$key];$i++){
  83. Router::$rules[$_rule]['action'][$ref][]=Router::$url[$i];
  84.  
  85.  
  86. }
  87. $ref=null;
  88.  
  89. }
  90. Router::$rules[$_rule]['action'][$key]=Router::$url[Router::$rules[$_rule]['action'][$key]];
  91.  
  92. }
  93. if(preg_match('/([0-9]+)\+/',Router::$rules[$_rule]['action'][$key],$out)){
  94. if($ref!==null){
  95. $i=Router::$rules[$_rule]['action'][$ref][0];
  96. unset(Router::$rules[$_rule]['action'][$ref][0]);
  97. for($i;$i<=$out[1];$i++){
  98. Router::$rules[$_rule]['action'][$ref][]=Router::$url[$i];
  99.  
  100.  
  101. }
  102.  
  103.  
  104. }
  105. Router::$rules[$_rule]['action'][$key]=array($out[1]+1);
  106. $ref=$key;
  107. }
  108. }
  109. else
  110. {
  111. Router::$rules[$_rule]['action'][$key]=Router::$rules['default']['action'][$key];
  112. }
  113. }
  114.  
  115.  
  116. }
  117. if($ref!==null){
  118. $i=Router::$rules[$_rule]['action'][$ref][0];
  119. unset(Router::$rules[$_rule]['action'][$ref][0]);
  120. for($i;$i<=count(Router::$url)-1;$i++){
  121. Router::$rules[$_rule]['action'][$ref][]=Router::$url[$i];
  122. }
  123.  
  124.  
  125. }
  126. if(Router::$debug)
  127. foreach(Router::$rules[$_rule]['action'] as $key => $value){
  128. if(is_array($value)){
  129. echo $key.'=>(<br>';
  130. foreach($value as $name){
  131. echo $name.'<br>';
  132.  
  133. }
  134. echo ')<br>';
  135. }
  136. else
  137. {
  138. echo $key.' => '.$value.'<br>';
  139. }
  140.  
  141. }
  142. Router::$result=Router::$rules[$_rule]['action'];
  143.  
  144. }
  145.  
  146.  
  147.  
  148. }
  149.  


przykład użycia
  1. Router::$debug=true;
  2. Router::setup();
  3. var_dump(Router::$url);
  4. echo '<br>exe: '.Router::$exe.'<hr>';
  5. Router::useAction(Router::checkRules());


kolejne sekcje w linku oddzielamy podkreślnikiem
przykład http://mojastrona/aa_aa_13_1_1_a.html <== pasuje do reguły 0(zero)


do zrobienia pozostało przede wszystkim
-optymalizacja
-optymalizacja
-głupoto odporność
-no i pewnie jakieś zabezpieczenia

co myślicie questionmark.gif
Crozin
Zdecydowanie za mało elementów statycznych i HTMLa w "debugu"!
sazian
debug jest tymczasowy żeby było widać "co się dzieje" w wersji "do użytku" będzie usunięty
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.