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.