Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

urls amigables en MVC

Estas en el tema de urls amigables en MVC en el foro de Frameworks y PHP orientado a objetos en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 25/07/2013, 12:05
 
Fecha de Ingreso: junio-2013
Mensajes: 17
Antigüedad: 8 años, 3 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.
  #2 (permalink)  
Antiguo 25/07/2013, 13:20
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 13 años, 8 meses
Puntos: 845
Respuesta: urls amigables en MVC

Hay mucha info sobre el tema, deberías buscar php router

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 06/08/2013, 13:41
 
Fecha de Ingreso: junio-2013
Mensajes: 17
Antigüedad: 8 años, 3 meses
Puntos: 0
Respuesta: urls amigables en MVC

Hola masterpuppet.
He estado leyendo bastante y aprendido unas cuantas cosas respecto al enrutamiento y he conseguido algunos avances con respecto al tratamiento de url, eso si horas y horas, bueno mejor dias y dias .
Pero hay una cosa que me gustaria conseguir y no se como.
Es conseguir http:www.nombre_dominio/argumentos.
Estas urls la verdad no se como conseguirlas, es decir, que no me aparezca el controlador ni el metodo.
Este tipo de url aparece en muchos CMS y E-COMMERCE pero no se como conseguirlas.
Si alguien me pudiera dar una idea, viendo por encima como esta armado el routing del framework se lo agradaceria mucho.
Gracias.
  #4 (permalink)  
Antiguo 10/08/2013, 18:12
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 16 años, 10 meses
Puntos: 43
Respuesta: urls amigables en MVC

No se como tenes armado para crear las rutas, pero en un sistema como CI podrias hacer esto
tenes dos formas:
1- armar en tu rotuer la regla para que no lo tome al controlador por ejemplo
misitio.com/usarios/verusuario/1
deberias poner algo como esto:
$route['(any:)'] = 'controlador/metodo/$1'
Igualmente no es recomendable porque si no tenes alguna forma de diferencias las url todo va a entrar por ahi.

2- La otra es un poco mas rebuscada y seria que guardes las url en una base de datos donde un campo sea la ruta con el metodo y el controlador.

saludos

Etiquetas: amigables, control, controlador, framework, mvc, php, urls
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:56.