1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| <?php
class Router{
static $routes = array();
static $prefixes = array();
/**
* Ajoute un prefix au Routing
**/
static function prefix($url,$prefix){
self::$prefixes[$url] = $prefix;
}
/**
* Permet de parser une url
* @param $url Url à parser
* @return tableau contenant les paramètres
**/
static function parse($url,$request){
$url = trim($url,'/');
if(empty($url)){
$url = Router::$routes[0]['url'];
}else{
$match = false;
foreach(Router::$routes as $v){
if(!$match && preg_match($v['redirreg'],$url,$match)){
$url = $v['origin'];
foreach($match as $k=>$v){
$url = str_replace(':'.$k.':',$v,$url);
}
$match = true;
}
}
}
$params = explode('/',$url);
if(in_array($params[0],array_keys(self::$prefixes))){
$request->prefix = self::$prefixes[$params[0]];
array_shift($params);
}
$request->controller = $params[0];
$request->action = isset($params[1]) ? $params[1] : 'index';
foreach(self::$prefixes as $k=>$v){
if(strpos($request->action,$v.'_') === 0){
$request->prefix = $v;
$request->action = str_replace($v.'_','',$request->action);
}
}
$request->params = array_slice($params,2);
return true;
}
/**
* Permet de connecter une url à une action particulière
**/
static function connect($redir,$url){
$r = array();
$r['params'] = array();
$r['url'] = $url;
$r['originreg'] = preg_replace('/([a-z0-9]+):([^\/]+)/','${1}:(?P<${1}>${2})',$url);
$r['originreg'] = str_replace('/*','(?P<args>/?.*)',$r['originreg']);
$r['originreg'] = '/^'.str_replace('/','\/',$r['originreg']).'$/';
// MODIF
$r['origin'] = preg_replace('/([a-z0-9]+):([^\/]+)/',':${1}:',$url);
$r['origin'] = str_replace('/*',':args:',$r['origin']);
$params = explode('/',$url);
foreach($params as $k=>$v){
if(strpos($v,':')){
$p = explode(':',$v);
$r['params'][$p[0]] = $p[1];
}
}
$r['redirreg'] = $redir;
$r['redirreg'] = str_replace('/*','(?P<args>/?.*)',$r['redirreg']);
foreach($r['params'] as $k=>$v){
$r['redirreg'] = str_replace(":$k","(?P<$k>$v)",$r['redirreg']);
}
$r['redirreg'] = '/^'.str_replace('/','\/',$r['redirreg']).'$/';
$r['redir'] = preg_replace('/:([a-z0-9]+)/',':${1}:',$redir);
$r['redir'] = str_replace('/*',':args:',$r['redir']);
self::$routes[] = $r;
}
/**
* Permet de générer une url à partir d'une url originale
* controller/action(/:param/:param/:param...)
**/
static function url($url = ''){
trim($url,'/');
foreach(self::$routes as $v){
if(preg_match($v['originreg'],$url,$match)){
$url = $v['redir'];
foreach($match as $k=>$w){
$url = str_replace(":$k:",$w,$url);
}
}
}
foreach(self::$prefixes as $k=>$v){
if(strpos($url,$v) === 0){
$url = str_replace($v,$k,$url);
}
}
return BASE_URL.'/'.$url;
}
static function webroot($url){
trim($url,'/');
return BASE_URL.'/'.$url;
}
} |
Partager