El patrón MVC divide una aplicación Web en tres capas:
Vista: Se encarga de generar el HTML que se envía al browser.
Controlador: Recibe y procesa los requerimiento del usuario y comunica los resultados a la vista para que los envíe al browser.
Modelo: Implementa la lógica del negocio.
La siguiente figura muestra un diagrama de bloques del funcionamiento de este patrón.
Para este ejemplo estoy utilizando NetBeans 6.8.
El objetivo de este ejemplo es implementar una aplicación que permita realizar una suma o una multiplicación.
La estructura de la solución es la siguiente:
La clase Session se utiliza para manejar datos de sesión:
public static function existsAttribute($name){
$rpta = FALSE;
if( isset( $_SESSION[$name] ) ){
$rpta = TRUE;
}
return $rpta;
}
public static function getAttribute($name) {
$rpta = null;
if( self::existsAttribute($name) ){
$rpta = $_SESSION[$name];
}
return $rpta;
}
public static function getAttribute2($name) {
$rpta = null;
if( self::existsAttribute($name) ){
$rpta = $_SESSION[$name];
unset( $_SESSION[$name] );
}
return $rpta;
}
public static function setAttribute($name, $value) {
$_SESSION[$name] = $value;
}
}
La clase Matematica implementa la lógica, en este caso las dos operaciones: sumar y multiplicar.
public function suma($n1, $n2){
$su = $n1 + $n2;
return $su;
}
public function producto($n1, $n2) {
$pr = $n1 * $n2;
return $pr;
}
}
session_start();
require_once '../util/Session.php';
$n1 = Session::getAttribute2("num1");
$n2 = Session::getAttribute2("num2");
$rpta = Session::getAttribute2("rpta");
$action = Session::getAttribute2("action");
?>
<html>
<head>
<title>Operaciones Simples</title>
</head>
<body>
<h1>Operaciones Simples</h1>
<form method="post" action="../controller/Controller.php">
<div>
<label>Operacion</label>
<select name="action">
<option value="sumar">Suma</option>
<option value="multiplicar">Producto</option>
</select>
</div>
<div>
<label>Número 1</label>
<input type="text" name="num1">
</div>
<div>
<label>Número 2</label>
<input type="text" name="num2">
</div>
<div>
<input type="submit" value="Procesar">
</div>
</form>
<div>
<table>
<tr>
<td>Action :</td>
<td><?php echo($action); ?></td>
</tr>
<tr>
<td>Num 1 :</td>
<td><?php echo($n1); ?></td>
</tr>
<tr>
<td>Num 2 :</td>
<td><?php echo($n2); ?></td>
</tr>
<tr>
<td>Rpta :</td>
<td><?php echo($rpta); ?></td>
</tr>
</table>
</div>
</body>
</html>
En el programa tenemos un control de tipo SELECT, al que se le ha dado el nombre ACTION, este este control que comunica al controlador el método a ejecutar.
La clase Controller recibe los datos del formulario, entre ellos el método a ejecutar, hace uso del Model para resolver el problema y se comunica con el View para que genere el HTML que irá al browser.
El script de la clase controller es el siguiente:
session_start();
require_once '../model/Matematica.php';
require_once '../util/Session.php';
$action = $_REQUEST["action"];
$obj = new Controller();
$target = call_user_func(array($obj,$action));
header("location: $target");
return;
class Controller {
public function sumar() {
$n1 = $_REQUEST["num1"];
$n2 = $_REQUEST["num2"];
$mate = new Matematica();
$rpta = $mate->suma($n1, $n2);
Session::setAttribute("num1", $n1);
Session::setAttribute("num2", $n2);
Session::setAttribute("rpta", $rpta);
Session::setAttribute("action", "Sumar");
return "../view/main.php";
}
public function multiplicar() {
$n1 = $_REQUEST["num1"];
$n2 = $_REQUEST["num2"];
$mate = new Matematica();
$rpta = $mate->producto($n1, $n2);
Session::setAttribute("num1", $n1);
Session::setAttribute("num2", $n2);
Session::setAttribute("rpta", $rpta);
Session::setAttribute("action", "Multiplicar");
return "../view/main.php";
}
}
?>
Como podemos apreciar, la programación del controlador es bastante sencillo, el campo action podría ser un campo oculto en un formulario, incluso su valor puede ser manipulado con JavaScript y también se puede manejar con AJAX.