figura 1

MVC para PHP con .htaccess y URLs amigables

Leyendo sobre RoR me topé con un concepto que ha tendio un auge paralelo al de la Web 2.0: Modelo Vista Controlador.

La wikipedia lo define de la siguiente forma:

MVC es un patrón de arquitectura de software que separa los datos de una aplicación, la interfaz de usuario, y la lógica de control en tres componentes distintos. El patrón MVC se ve frecuentemente en aplicaciones web, donde la vista es la página HTML y el código que provee de datos dinámicos a la página, el modelo es el Sistema de Gestión de Base de Datos y el controlador respresenta la Lógica de negocio.

En términos más simples, se trata de un patrón diseño donde el HTML es provisto de DATOS dinámicamente según las ACCIONES realizadas por el usuario.

Dicho así, en realidad, no es nada nuevo. Sin embargo, al sumarle otros factores dentro de la producción de aplicaciones web, tales como la Programación Orientada a Objetos, por una parte, y la separación en capas de la estructura HTML en CSS y contenido, por otra, es posible tener un mapa más claro de todos los elementos que son necesarios a la hora de iniciar un proyecto web 2.0.

Una forma simple de aplicar y entender este patrón con PHP es a través de la utilización de plantillas y friendly url’s.  Para esto es necesario tener activado y configurado correctament el módulo de Apache “mod_rewrite” (debes consultarlo a tu proveedor de hosting)
Una vez activado el “mod_rewrite”, editas el archivo .htaccess de tu sitio y escribes:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Esto hará que todas las peticiones a  tu sitio sean redirigidas al archivo index.php, desde donde podremos determinar cuál será la vista según la url escrita en la barra de direcciones.

figura 1

Por ejemplo, si la petición al sitio es la url “http://www.tusitio.com/contacto/”, el controlador debería solicitar al modelo los datos que correspondan para ser mostrados en la vista formulario_contacto.php.

Para lograr esto primero necesitamos crear una función que detecte cuál ha sido la URL tipeada:

function uriend() {
$uri=$_SERVER["REQUEST_URI"];            //detectamos la url
$uri=substr($uri, -1)==”/”?$uri:$uri.”/”;   //detectamos el slash final, sino está lo agregamos
return $uri;
}

Entonces, a partir de la URL detectada podremos obtener los datos correspondientes desde la base de datos. Para este caso he utilizado una clase para conexiones a  bb.dd MySQL que pudes ver en Nación Web.

$uri=@uriend();
$query=$pqdb->getrowobject($pqdb->contenido,’url’, $uri);
define (‘theme’, ‘carpeta_de_plantillas/’);

En concreto, la variable $query correponde a un objeto que cuenta con los atributos nombre, título, contenido, url y plantilla, entre otros. Estos atributos, a su vez, son campos en la tabla “contenido” dentro de la bb.dd a la que se está conectando.
De esta forma, si la consulta es exitosa, es decir, si en la tabla “contenido” de la bb.dd existe un campo url cuyo valor es “/contacto/”, obtenemos la información asociada a esa fila y, finalmente, determinamos cual será la vista (plantilla) que usaremos.

if (file_exists(theme.$query->plantilla.”.php”)){
include(theme.$query->plantilla.”.php”);
}
else{
if ($query->nombre==’home’ ){
include(theme.’index.php’);
}
else{
$query=$pqdb->getrowobject($pqdb->contenido,’url’,'/error/’);
include(theme.’error.php’);
}
}

En resumen, primero comprobamos si la plantilla asignada en la bb.dd a la página “/contacto/” corresponde o existe en la “carpeta de plantillas”. Si es así, usamos la plantilla y desplegamos la vista. En contrario, significa que estamos en la home del sitio o que la plantilla no existe, por lo que se mostrará la plantilla index.php o error.php, según sea el caso.

One thought on “MVC para PHP con .htaccess y URLs amigables

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>