Ver Mensaje Individual
  #1 (permalink)  
Antiguo 25/07/2013, 12:05
gusno
 
Fecha de Ingreso: junio-2013
Mensajes: 17
Antigüedad: 10 años, 9 meses
Puntos: 0
urls amigables en MVC

Hola.
Intentare resumir lo mas que pueda.
Pues para aprender arme de 0 un framework basico MVC modular, a partir de unos tutoriales que te guian y me ha surgido el siguiente problema relacionado con las urls enriquecidas:
ahora las tengo http://www.dominio/controlador/metodo/argumentos, hasta ahi todo bien, por ejemplo puedo poner http://www.hoteles/hoteles/localizacion/hoteles-baratos-en-madrid.
El problema viene si quiero poner por ejemplo http://www.hoteles/hoteles-baratos/localizacion-de-zona/hoteles-baratos-en-madrid, es decir, trabajar frases en lugar de una sola palabra en el controlador y el metodo.

He buscado bastante en la red pero no he encontrado nada.
Aqui os dejo el codigo:
1º el request
Código:
<?php
/*
 * Clase que recibe la peticion que viene via url
 * 
 */
class Request
{
    private $_modulo;
    private $_controlador;
    private $_metodo;
    private $_argumentos;
    private $_modules;
    
    public function __construct() 
{
   if(isset($_GET['url']))
    {
      $url = filter_input(INPUT_GET, 'url', FILTER_SANITIZE_URL);
      $url = explode('/', $url);
      $url = array_filter($url);
            
      /* modulos de la app 
       * Vamos a obtener 2 tipos de url:
       * primer tipo-> modulo/controlador/metodo/argumentos
       * segundo tipo->controlador/metodo/argumentos
       * 
       */
      $this->_modules = array('backend');//modulos
      $this->_modulo = strtolower(array_shift($url));
            
        if(!$this->_modulo)
            {
             $this->_modulo = false;
            }
         else
            {
              if(count($this->_modules))
                  {
                    if(!in_array($this->_modulo, $this->_modules))
                     {
                        $this->_controlador = $this->_modulo;
                        $this->_modulo = false;
                     }
                    else
                     {
                        $this->_controlador = strtolower(array_shift($url));
          /*
           * Todo modulo va a tener un controlador index por defecto
           */
                        if(!$this->_controlador)
                           {
                            $this->_controlador = 'index';
                           }
                     }
                   }
              else
                  {
                     $this->_controlador = $this->_modulo;
                     $this->_modulo = false;
                  } 
            }
            $this->_metodo = strtolower(array_shift($url));
            $this->_argumentos = $url; 
            
       }
         if(!$this->_controlador)
          {
            $this->_controlador = DEFAULT_CONTROLLER;
          }
        
        if(!$this->_metodo)
        {
            $this->_metodo = 'index';
        }
        
        if(!isset($this->_argumentos))
        {
            $this->_argumentos = array();
        }
        
      
}
    
    public function getModulo()
    {
        return $this->_modulo;
    }
    public function getControlador()
    {
        return $this->_controlador;
    }
    
    public function getMetodo()
    {
        return $this->_metodo;
    }
    
    public function getArgs()
    {
        return $this->_argumentos;
    }
        
    
    
}
2º el bootstrap:
Código:
class Bootstrap
{
    public static function run(Request $peticion)
    {
        $modulo = $peticion->getModulo();
        $controller = $peticion->getControlador() . 'Controller';
         $metodo = $peticion->getMetodo();
        $args = $peticion->getArgs();
 //Si existe un modulo va a ir al controlador base de ese modulo
        if($modulo)
         {
            $rutaModulo = ROOT . 'controllers' . DS . $modulo . 'Controller.php';
            
                if(is_readable($rutaModulo))
                    {
                    require_once $rutaModulo;
                    $rutaControlador = ROOT . 'modules'. DS . $modulo . DS . 'controllers' . DS . $controller . '.php';
                    }
                 else
                  {
                    throw new Exception('Error de base de modulo');
                  }
        }
        else
        {
            $rutaControlador = ROOT . 'controllers' . DS . $controller . '.php';
        }
        
       
       
        
        if(is_readable($rutaControlador)){
        require_once $rutaControlador;
        $controller = new $controller;
            
             if(is_callable(array($controller, $metodo))){
                $metodo = $peticion->getMetodo();
            }
            else{
                $metodo = 'index';
            }
            
            if(isset($args)){
                call_user_func_array(array($controller, $metodo), $args);
            }
            else{
                call_user_func(array($controller, $metodo));
            }
            
        } else {
            throw new Exception('controlador no encontrado');
        }
    }
}
?>
3º el .htaccess:
Código:
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^(.+)$ index.php?url=$1  [QSA,L]
A ver si alguien me da una idea de como podria hacerlo, ya sea modificando el request, el bootstrap o el htaccess,ya que seguro los que manejan frameworks conocidos deben poder trabajar las urls como ellos vean.
saludos de un aprendiz.