Despabilando la MonoNeurona::Internet es de todos [Inicio] [Regresar]
WWW \ MVC en tres pasos, en PHP y sin objetos
WWW
MVC en tres pasos, en PHP y sin objetos

Este artículo ha sido consultado en 654 ocasiones.

MVC en tres pasos, en PHP y sin objetos (y nada más)

MVC significa "Modelo, Vista y Controlador".

A grandes rasgos: el Modelo es todo acceso a base de datos, y las funciones que llevan lo que llaman "lógica de negocio". O sea, las funciones más "pequeñas" con significado: ingresar una cantidad, obtener un listado de historias, ...

La vista, en una aplicación web, es el HTML (o XML, WAP, PDF, ...) y lo necesario para convertir datos en HTML. El acceso a bases de datos no es vista. La gestión de sesiones no es vista.

El controlador es lo que une la vista y el modelo. Por ejemplo, son las funciones que toman los valores de un formulario, consultan la base de datos (a través del modelo) y producen valores, que la vista tomará y convertirá en HTML.

1. M de Modelo

Las funciones "con significado" que mencioné antes deberían estar agrupadas lógicamente. O sea, no de una "forma lógica", sino que las que sean parecidas estén juntas.

El modelo incluye todas las funciones necesarias para acceder a bases de datos, recursos de la máquina, etc.

Estas funciones son de acceso a base de datos. Son funciones muy simples, que por si solas no tienen "significado" fuera de la base de datos:

function db_quitar_dinero ($cuenta, $cantidad)
function db_contar_historias ()
function db_buscar_productos_de_fabricante ($fabricante)
function db_borrar_usuario ($usuario)

Estas funciones tienen "significado": son operaciones "reales" sobre cosas "reales":

function obtener_historias ($num)
function transferir_dinero ($cantidad, $orig, $dest)
function añadir_carrito ($producto, $unidades, $usuario)

La principal diferencia es que las primeras son simples operaciones sobre la base de datos, y que las segundas pueden componerse de una o varias llamadas a funciones de acceso a base de datos y, posiblemente, cierta cantidad de "procesamiento".

Ejemplo:


function db_obtener_productos () {
  $prod = array();

  mysql_pconnect (DBHOST, DBUSER, DBPASS);
  mysql_select_db (DBNAME);
  $query = "SELECT id, nombre, cantidad, descripcion FROM productos";
  $result = mysql_query ($query);
  while ($row = mysql_fetch_array ($result)) {
array_push ($prod, $row);
  }

  return $prod;
}

function obtener_productos ($letra) {
  if ($letra == "") {
return db_obtener_productos ();
  } else {
return db_obtener_productos_con_letra ($letra);
  }
}



Razones

Cada acceso a base de datos se pone en su función individual porque, de esta forma, si se cambia de gestor de bases de datos este cambio sólo afecta a estas funciones, no al resto de la aplicación.

Tener el modelo bien delimitado permite la existencia de varias aplicaciones que compartan el mismo modelo (por ejemplo, una aplicación "tienda" y una "contabilidad" que accedan a las bases de datos de inventario, ventas, ...)

2. C de Controlador

El controlador no accede (directamente) a la base de datos, ni genera (directamente) HTML; se limita a obtener valores, procesarlos y obtener otros valores (además de la gestión de sesiones, cookies, logs y ese tipo de tonterías). Lo típico es recoger los valores de un formulario, procesarlos, trabajar un poco con la base de datos, procesar algo más, y almacenar el resultado en una o varias variables:


$letra = $POST["letra"]
if (($letra < "A") || ($letra > "Z")) {
  include "letranovalida.php";
} else {
  $productos = obtener_productos ($letra);
  include "listadoproductos.php";
}



letranovalida.php y listadoproductos.php son parte de la vista. El segundo fichero hace uso de la variable $productos para mostrar el listado. Como se puede ver, el controlador no se mete con HTML; se limita a obtener el listado de la base de datos y pasárselo, tal cual, a la vista.

Razones

De este modo, el código que "hace algo" está perfectamente separado del código dedicado a crear HTML, lo que ayuda a evitar el spaghetti.

3. V de Vista

La vista es la parte de la aplicación dedicada a generar HTML. Puede ser simple HTML estático:


<h1>Listado de productos</h1>


O HTML dinámico generado en respuesta a una consulta, por ejemplo:


<table>
<?php foreach ($productos as $p) { ?>
<tr><td><a href="verproducto.php?id=<?=$p["id"]?>"><?=$p["nombre"]?></a></td>

<td><?=$p["cantidad"]?></td></tr>
<?php } ?>
</table>


La vista no debería llamar a ninguna función; debería limitarse a construcciones de control de flujo simple: if, for/foreach, while, ...

Todas las variables empleadas por la vista deberían proceder del controlador; utilizar directamente variables procedentes del usuario es una práctica muy peligrosa.

Razones

Tener la vista separada del controlador permite cambiar la aplicación para que genere, en lugar de HTML, algo distinto (por ejemplo, WML), sin tener que tocar más que una parte completamente delimitada del código.

Básicamente, MVC es esto. Lo demás (objetos, etc) son refinamientos.


Jacobo Tarrío

Last modified: Tue Dec 3 14:35:55 CET 2002
$Id: mvc.html,v 1.2 2002/12/03 13:36:12 jtarrio Exp $

Última actualización: 2007-04-29 10:56:59-05



ir arriba
The Queen is here Mozilla Firefox The Best DataBase CakePHP Framework CSS GNU Hacker