napisałem skrypt routera i chciałbym się dowiedzieć "co o nim inni myślą"
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]
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)
class Router{ 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]+$', 'action'=>array('dir'=>0,'controler'=>1,'method'=>'1+','parms'=>'3+')), 'action'=>array('controler'=>1)), 'default'=>array('', 'action'=>array('dir'=>'default_dir','controler'=>'default_controler','method'=>'default_method','parms'=>'any')) ); public function __construct(){ } } $prev=0;//numer poprzedniej reguły $use=0;//obecnie używana reguła(np 1,1+ ...) $next=false;//przejście do następnej tablicy reguł $count=0;//liczba użytych reguł foreach(Router::$rules as $rule=>$v){//przeszukiwanie tablicy reguł if($_rule!=='action'){ foreach(Router::$url as $key => $value){//przeszukiwanie adresów $prev=$use=$key; } else if($use.''==$prev.'+'){ $count--;//jeśli poprawne przejście } $use=$prev.'+'; } $next=true;//następna tablica regół $prev=$use=$count=0; break;//wyjście z tablicy regół } ((!$i)?'true':'false').'<hr>'; $_count++; } if($next){//następna tablica reguł $next=false; next; } if(($_count>=count(Router::$rules[$rule])-1)||($rule==='default')){//jeśli dopasowano wszystkie lub nie dopasowano żadnej break; } $prev=$use=$count=0; } } return $rule; } if($_rules!=='default'){ $ref=null; foreach(Router::$rules['default']['action'] as $key => $value ){ if($ref!==null){ $i=Router::$rules[$_rule]['action'][$ref][0]; for($i;$i<=Router::$rules[$_rule]['action'][$key];$i++){ Router::$rules[$_rule]['action'][$ref][]=Router::$url[$i]; } $ref=null; } Router::$rules[$_rule]['action'][$key]=Router::$url[Router::$rules[$_rule]['action'][$key]]; } if($ref!==null){ $i=Router::$rules[$_rule]['action'][$ref][0]; for($i;$i<=$out[1];$i++){ Router::$rules[$_rule]['action'][$ref][]=Router::$url[$i]; } } $ref=$key; } } else { Router::$rules[$_rule]['action'][$key]=Router::$rules['default']['action'][$key]; } } } if($ref!==null){ $i=Router::$rules[$_rule]['action'][$ref][0]; Router::$rules[$_rule]['action'][$ref][]=Router::$url[$i]; } } if(Router::$debug) foreach(Router::$rules[$_rule]['action'] as $key => $value){ foreach($value as $name){ } } else { } } Router::$result=Router::$rules[$_rule]['action']; } }
przykład użycia
Router::$debug=true; Router::setup(); 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