Witam,
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]
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+')),
array(0=>'^[A-Za-z][A-Za-z0-9]*$',1=>'^[A-Za-z][A-Za-z0-9]*$',2=>'^[0-9]+$',3=>'^[a-z]$', 'action'=>array('controler'=>1)),
'default'=>array('',
'action'=>array('dir'=>'default_dir','controler'=>'default_controler','method'=>'default_method','parms'=>'any'))
);
public function __construct(){
}
public static function setup
(){ list
(Router
::$url[count(Router
::$url)-1
],Router
::$exe)=explode('.',Router
::$url[count(Router
::$url)-1
]);
}
public static function checkRules
(){ $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
if(isset(Router
::$rules[$rule][$key])){//jeśli postać liczbowa... $prev=$use=$key;
}
else
if(isset(Router
::$rules[$rule][$prev.'+'])){//jeśli postać z plusem... if($use.''==$prev.'+'){
$count--;//jeśli poprawne przejście
}
$use=$prev.'+';
}
if(Router
::$debug)echo $rule.'=>'.$use.' : '; if($i=(!preg_match('/'.Router
::$rules[$rule][$use].'/',$value))){//jeśli nie pasuje do wzorca ... $next=true;//następna tablica regół
if(Router
::$debug)echo 'NEXT<hr>'; $prev=$use=$count=0;
break;//wyjście z tablicy regół
}
if(Router
::$debug)echo 'TRUE c_max '.count(Router
::$rules[$rule]).' c '.$count.' i: '. ((!$i)?'true':'false').'<hr>';
$_count++;
}
if($next){//następna tablica reguł
$next=false;
}
if(($_count>=count(Router
::$rules[$rule])-1
)||($rule==='default')){//jeśli dopasowano wszystkie lub nie dopasowano żadnej if(Router
::$debug)echo 'RETURN: '.$rule; break;
}
$prev=$use=$count=0;
}
}
return $rule;
}
public static function useAction
($_rule){
if(Router
::$debug)echo '<br><br><hr>ACTION: <br>'; if($_rules!=='default'){
$ref=null;
foreach(Router::$rules['default']['action'] as $key => $value ){
if(isset(Router
::$rules[$_rule]['action'][$key])){ if(is_int(Router
::$rules[$_rule]['action'][$key])){ if($ref!==null){
$i=Router::$rules[$_rule]['action'][$ref][0];
unset(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(preg_match('/([0-9]+)\+/',Router
::$rules[$_rule]['action'][$key],$out)){ if($ref!==null){
$i=Router::$rules[$_rule]['action'][$ref][0];
unset(Router
::$rules[$_rule]['action'][$ref][0
]); for($i;$i<=$out[1];$i++){
Router::$rules[$_rule]['action'][$ref][]=Router::$url[$i];
}
}
Router
::$rules[$_rule]['action'][$key]=array($out[1
]+1
); $ref=$key;
}
}
else
{
Router::$rules[$_rule]['action'][$key]=Router::$rules['default']['action'][$key];
}
}
}
if($ref!==null){
$i=Router::$rules[$_rule]['action'][$ref][0];
unset(Router
::$rules[$_rule]['action'][$ref][0
]); for($i;$i<=count(Router
::$url)-1;$i++){ Router::$rules[$_rule]['action'][$ref][]=Router::$url[$i];
}
}
if(Router::$debug)
foreach(Router::$rules[$_rule]['action'] as $key => $value){
foreach($value as $name){
}
}
else
{
echo $key.' => '.$value.'<br>'; }
}
Router::$result=Router::$rules[$_rule]['action'];
}
}
przykład użycia
Router::$debug=true;
Router::setup();
echo '<br>exe: '.Router
::$exe.'<hr>'; 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