jueves, 7 de junio de 2012

Patron de Diseno Modelo - Vista - Controlador

Modelo Vista Controlador (MVC): Es un patrón de arquitectura de software que separa los datos de una aplicación, la interfaz de usuario, y la logica de negocio en tres componentes distintos. El patrón de llamada y retorno MVC (según CMU), 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 Gestion de Base de Datos y la Lógica de negocio, y el controlador es el responsable de recibir los eventos de entrada desde la vista.
 








Un diagrama sencillo que muestra la relación entre el modelo, la vista y el controlador.

 

Descripción del patrón


1) Modelo (model): Esta es la representación específica de la información con la cual el sistema opera. En resumen, el modelo se limita a lo relativo de la vista y su controlador facilitando las presentaciones visuales complejas. El sistema también puede operar con más datos no relativos a la presentación, haciendo uso integrado de otras lógicas de negocio y de datos afines con el sistema modelado. 

2) Vista (view): Este presenta el modelo en un formato adecuado para interactuar, usualmente la interfaz de usuario.

3) Controlador (Controller): Este responde a eventos, usualmente acciones del usuario, e invoca peticiones al modelo y, probablemente, a la vista.

Ejemplo:

Para implementar este patrón y entenderlo un poco más, veremos como convertir una aplicación PHP básica en una aplicación basada en la arquitectura MVC. En este caso, la aplicación será un listado de posts en un blog. En la manera tradicional de PHP, mostrar un listado de post desde la base de datos, se vería como el siguiente script:
<?php// Connecting, selecting database
$link = mysql_connect('localhost', 'myuser', 'mypassword');
mysql_select_db('blog_db', $link);
 
// Performing SQL query
$result = mysql_query('SELECT date, title FROM post', $link); 
?>
<html>
  <head>
    <title>List of Posts</title>
  </head>
  <body>
   <h1>List of Posts</h1>
   <table>
     <tr><th>Date</th><th>Title</th></tr>
<?php
// Printing results in HTML
while($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
    echo "<tr>";
    printf("<td> %s </td>", $row['date']);
    printf("<td> %s </td>", $row['title']);
    echo "</tr>";
}
?>
    </table>
  </body>
</html>
<?php
// Closing connection
mysql_close($link);
?>

El script de arriba es rápido de escribir, rápido de ejecutar, pero es muy poco mantenible; algunos de los problemas que encontramos son que no hay chequeo de error (¿qué ocurre si la conexión a la base de datos falla?), el HTML y el código PHP están mezclados incluso entrelazados, y el código está atado a un base de datos MySQL.

Separando la Presentación

Las llamadas a las funciones echo y printf del script de arriba hacen el código difícil de leer. Modificar el código HTML para mejorar la presentación es un fastidio con la sintáxis actual. Por lo tanto, podemos separar el código en dos partes. Primero, el código PHP con toda la lógica de negocio en un script controlador (controller), como se muestra en el siguiente script (index.php):

<?php
$link = mysql_connect('localhost', 'myuser', 'mypassword');
mysql_select_db('blog_db', $link);
 
$result = mysql_query('SELECT date, title FROM post', $link);
 
$posts = array();
while($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
  $posts[] = $row;
}
 
mysql_close($link);
require('view.php');

 El código HTML, el cual contiene algo de código PHP, es guardado en un script de vista (view.php):


<html>
  <head>
    <title>List of Posts</title>
  </head>
  <body>
    <h1>List of Posts</h1>
    <table>
      <tr><th>Date</th><th>Title</th></tr>
    <?php foreach($posts as $post): ?><tr>
        <td><?php echo $post['date'] ?></td>
        <td><?php echo $post['title'] ?></td>
      </tr><?php endforeach; ?>
    </table>
  </body>
</html>
 
 Separando la manipulación de datos

<?php 
 
function getAllPosts(){
  $link = mysql_connect('localhost', 'myuser', 'mypassword');
  mysql_select_db('blog_db', $link);
 
  $result = mysql_query('SELECT date, title FROM post', $link);
 
  $posts = array();
  while($row = mysql_fetch_array($result, MYSQL_ASSOC))
  {
     $posts[] = $row;
  }
  mysql_close($link);
 
  return $posts;
}
 
Y modificando el controlador (index.php) para incluir el modelo, tenemos:
 
<?php
require_once('model.php');

$posts = getAllPosts();

require('view.php'); 
 
De este modo, el controlador es totalmente leible, ya que su única tarea es obtener los datos desde el modelo y pasarselo a la vista. En aplicaciones más complejas, el controlador además maneja la petición, la sesión de usuario, la autenticación, y demàs cosas.

No hay comentarios:

Publicar un comentario