KumbiaPHP beta2-dev
Framework PHP en español
router.php
Ir a la documentación de este archivo.
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 }
 Todo Estructuras de Datos Namespaces Archivos Funciones Variables Enumeraciones