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:
2º el bootstrap:<?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; } }
Código:
3º el .htaccess: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'); } } } ?>
Código:
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.RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-l RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
saludos de un aprendiz.