KumbiaPHP beta2-dev
Framework PHP en español
|
00001 <?php 00022 final class Router 00023 { 00029 private static $_vars = array( 00030 'route' => NULL, //Ruta pasada en el GET 00031 'module' => NULL, //Nombre del modulo actual 00032 'controller' => 'index', //Nombre del controlador actual 00033 'action' => 'index', //Nombre de la acción actual, por defecto index 00034 'parameters' => array(), //Lista los parametros adicionales de la URL 00035 'routed' => FALSE, //Indica si esta pendiente la ejecución de una ruta por parte del dispatcher 00036 'controller_path' => 'index' 00037 ); 00038 00044 public static function rewrite($url) 00045 { 00046 //Valor por defecto 00047 self::$_vars['route'] = $url; 00048 00049 // Se miran los parametros por seguridad 00050 str_replace(array( '\\', '/../','//'), '', $url, $errors); 00051 // Si hay intento de hack TODO: añadir la ip y referer en el log 00052 if($errors) throw new KumbiaException("Posible intento de hack en URL: '$url'"); 00053 00054 //Si config.ini tiene routes activados, mira si esta routed 00055 if(Config::get('config.application.routes')){ 00056 $url = self::ifRouted($url); 00057 } 00058 if($url == '/'){ 00059 return self::$_vars; 00060 } 00061 //Se limpia la url, en caso de que la hallan escrito con el último parámetro sin valor, es decir controller/action/ 00062 // Obtiene y asigna todos los parámetros de la url 00063 $url_items = explode ('/', trim($url,'/')); 00064 00065 // El primer parametro de la url es un módulo? 00066 if(is_dir(APP_PATH . "controllers/$url_items[0]")) { 00067 self::$_vars['module'] = $url_items[0]; 00068 00069 // Si no hay mas parametros sale 00070 if (next($url_items) === FALSE) { 00071 self::$_vars['controller_path'] = "$url_items[0]/index"; 00072 return self::$_vars; 00073 } 00074 } 00075 00076 // Controlador 00077 self::$_vars['controller'] = current($url_items); 00078 self::$_vars['controller_path'] = (self::$_vars['module']) ? "$url_items[0]/$url_items[1]" : current($url_items); 00079 // Si no hay mas parametros sale 00080 if (next($url_items) === FALSE) { 00081 return self::$_vars; 00082 } 00083 00084 // Acción 00085 self::$_vars['action'] = current($url_items); 00086 // Si no hay mas parametros sale 00087 if (next($url_items) === FALSE) { 00088 return self::$_vars; 00089 } 00090 00091 // Crea los parámetros y los pasa 00092 self::$_vars['parameters'] = array_slice($url_items, key($url_items)); 00093 return self::$_vars; 00094 } 00095 00101 private static function ifRouted($url) 00102 { 00103 $routes = Config::read('routes'); 00104 $routes = $routes['routes']; 00105 00106 // Si existe una ruta exacta la devuelve 00107 if(isset($routes[$url])){ 00108 return $routes[$url]; 00109 } 00110 00111 // Si existe una ruta con el comodin * crea la nueva ruta 00112 foreach ($routes as $key => $val) { 00113 if($key == '/*'){ 00114 return rtrim($val,'*').$url; 00115 } 00116 00117 if (strripos($key,'*',-1)){ 00118 $key = rtrim($key, '*'); 00119 if(strncmp($url, $key, strlen($key)) == 0) return str_replace($key, rtrim($val,'*'), $url); 00120 } 00121 } 00122 00123 return $url; 00124 } 00125 00131 public static function getRouted() 00132 { 00133 return self::$_vars['routed']; 00134 } 00135 00140 public static function setRouted($value) 00141 { 00142 self::$_vars['routed'] = $value; 00143 } 00144 00151 public static function route_to() 00152 { 00153 00154 static $cyclic = 0; 00155 self::$_vars['routed'] = TRUE; 00156 $url = Util::getParams(func_get_args()); 00157 00158 if(isset($url['module'])){ 00159 self::$_vars['module'] = $url['module']; 00160 self::$_vars['controller'] = 'index'; 00161 self::$_vars['action'] = 'index'; 00162 self::$_vars['parameters'] = array(); 00163 self::$_vars['controller_path'] = $url['module']. '/index'; 00164 } 00165 00166 if(isset($url['controller'])){ 00167 self::$_vars['controller'] = $url['controller']; 00168 self::$_vars['action'] = 'index'; 00169 self::$_vars['parameters'] = array(); 00170 self::$_vars['controller_path'] = (isset($url['module'])) ? $url['module'].'/'.$url['controller'] : $url['controller']; 00171 } 00172 00173 if(isset($url['action'])){ 00174 self::$_vars['action'] = $url['action']; 00175 self::$_vars['parameters'] = array(); 00176 } 00177 00178 if(isset($url['parameters'])){ 00179 self::$_vars['parameters'] = explode('/',$url['parameters']); 00180 }elseif (isset($url['id'])){ 00181 // Deprecated 00182 self::$_vars['parameters'] = array($url['id']); 00183 } else { 00184 self::$_vars['parameters'] = array(); 00185 } 00186 00187 if(++$cyclic > 1000) throw new KumbiaException('Se ha detectado un enrutamiento cíclico. Esto puede causar problemas de estabilidad'); 00188 } 00189 00205 public static function get($var = NULL) 00206 { 00207 if($var){ 00208 return self::$_vars[$var]; 00209 } else { 00210 return self::$_vars; 00211 } 00212 } 00213 00221 public static function redirect($route = NULL, $seconds = NULL) 00222 { 00223 if(!$route) $route = self::$_vars['controller_path'].'/'; 00224 $route = PUBLIC_PATH . ltrim($route,'/'); 00225 if($seconds){ 00226 header("Refresh: $seconds; url=$route"); 00227 } else { 00228 header("Location: $route"); 00229 $_SESSION['KUMBIA.CONTENT'] = ob_get_clean(); 00230 View::select(NULL, NULL); 00231 } 00232 } 00233 00234 00242 public static function toAction($action, $seconds = NULL) 00243 { 00244 self::redirect(self::$_vars['controller_path'] . "/$action", $seconds); 00245 } 00246 }