Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [skrypt/klasa]Router
sazian
post 22.10.2010, 17:55:02
Post #1





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
Crozin
post 22.10.2010, 18:00:20
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Zdecydowanie za mało elementów statycznych i HTMLa w "debugu"!
Go to the top of the page
+Quote Post
sazian
post 22.10.2010, 18:02:38
Post #3





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


debug jest tymczasowy żeby było widać "co się dzieje" w wersji "do użytku" będzie usunięty
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 00:35