Modelo vista controlador (MVC) en PHP
En programación, podemos encontrarnos con distintas formas de organizar la lógica y el código de nuestro software. Es recomendable encontrar una buena forma, para evitar cometer uno de los errores más complicados de arreglar, no poseer un código ordenado y bien aplicado.
El paradigma modelo vista controlador (MVC) es un patrón de diseño que separa el código en tres capas. Utilizar un patrón de diseño a menudo es muy recomendable, ya que es una forma estandarizar nuestro código, optimizarlo y hacer que sea más legible.
Si vamos a utilizar este patrón de diseño, es importante conocer también cómo funciona POO (programación orientada a objetos). En nuestro caso, utilizaremos el lenguaje de programación PHP.
Definiciones
Modelo
Gestiona todo lo relacionado con la información y la iteración con los datos de nuestra aplicación. Todas las peticiones de acceso a los datos pasará por esta capa.
Controlador
Une la vista y el modelo. El usuario solicitará información por medio de la vista y esta hará la petición al controlador. Posteriormente, este, realizará la petición al modelo.
Vista
Es la capa que nos mostrará la información formateada. También desde dónde el usuario puede solicitar más información.
Ejemplo
Este es un ejemplo muy básico. Creamos una base de datos de los servicios que podría realizar un taller y operamos con ella utilizando el paradigma MVC.
Estructura:
BD:
controllers/controlador.php
<?php
require_once("../models/modelo.php");
$services = new Service();
$datos = $services->getServicios();
require_once("../views/vista.php");
?>
models/modelo.php
<?php
class Service {
private $servicio;
private $db;
public function __construct() {
$this->servicio = array();
$this->db = new PDO('mysql:host=localhost;dbname=ejemplo_mvc', "root", "");
}
private function setNames() {
return $this->db->query("SET NAMES 'utf8'");
}
public function getServicios() {
self::setNames();
$sql = "SELECT id, nombre, precio FROM servicio";
foreach ($this->db->query($sql) as $res) {
$this->servicio[] = $res;
}
return $this->servicio;
}
public function setServicio($nombre, $precio) {
self::setNames();
$sql = "INSERT INTO servicio(nombre, precio) VALUES ('" . $nombre . "', '" . $precio . "')";
$result = $this->db->query($sql);
if ($result) {
return true;
} else {
return false;
}
}
}
?>
views/vista.php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ejemplo MVC con PHP</title>
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" >
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script type="text/javascript" src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<header class="text-center">
<h1>Ejemplo MVC con PHP</h1>
<hr/>
<p class="lead">Creamos una base de datos de los servicios <br/>
que podría realizar un taller y <br/>
operamos con ella utilizando el paradigma MVC</p>
</header>
<div class="col-lg-6 text-center">
<hr/>
<h3>Listado de servicios</h3>
<table class="table">
<tr>
<td><strong>SERVICIO</strong></td>
<td><strong>PRECIO</strong></td>
</tr>
<?php
for ($i = 0; $i < count($datos); $i++) {
?>
<tr>
<td><?php echo $datos[$i]["nombre"]; ?></td>
<td><?php echo $datos[$i]["precio"]; ?> €</td>
</tr>
<?php
}
?>
</table>
<a href="../index.php"> <i class="fa fa-arrow-circle-left"></i> Volver a la página principal</a>
<hr/>
</div>
<footer class="col-lg-12 text-center">
Adaweb - <?php echo date("Y"); ?>
</footer>
</div>
</body>
</html>
index.php
<!DOCTYPE html>
<?php
if ((isset($_POST['nombre'])) && ($_POST['nombre'] != '') && (isset($_POST['precio'])) && ($_POST['precio'] != '')) {
include "models/modelo.php";
$nuevo = new Service();
$asd = $nuevo->setServicio($_POST['nombre'], $_POST['precio']);
}
?>
<html>
<head>
<meta charset="UTF-8">
<title>Ejemplo MVC con PHP</title>
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" >
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script type="text/javascript" src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<header class="text-center">
<h1>Ejemplo MVC con PHP</h1>
<hr/>
<p class="lead">Creamos una base de datos de los servicios <br/>
que podría realizar un taller y <br/>
operamos con ella utilizando el paradigma MVC</p>
</header>
<div class="row">
<div class="col-lg-6">
<form action="#" method="post" class="col-lg-5">
<h3>Nuevo servicio</h3>
Nombre: <input type="text" name="nombre" class="form-control"/>
Precio: <input type="text" name="precio" class="form-control"/>
<br/>
<input type="submit" value="Crear" class="btn btn-success"/>
</form>
</div>
<div class="col-lg-6 text-center">
<hr/>
<h3>Listado de servicios</h3>
<a href="controllers/controlador.php"><i class="fa fa-align-justify"></i> Acceder al listado de servicios</a>
<hr/>
</div>
</div>
<footer class="col-lg-12 text-center">
Adaweb - <?php echo date("Y"); ?>
</footer>
</div>
</body>
</html>
Lo he probado y funciona muy bien y se entiende perfectamente gracias
De donde salio el array $datos?
$datos = $services->getServicios();
Podrias agregar para modificar y eliminar en este mismo ejemplo?
Hola, donde pones:
return $this->servicio;
$this->db = null;
entiendo que es un error pues después del return en php no se ejecuta nada ¿no?
Gracias.
Hola;
ciertamente lo que dices es correcto, ha sido por despiste. Queda corregido.
Un saludo y muchas gracias por avisarnos!
Entiendo que en index.php debe existir una llamada a controllers/controlador.php o estoy errado?
Hola;
en este ejemplo no utilizamos en controlador.php en el index.php, sólo para listar los servicios en vista.php
Se trata de un simple código de ejemplo, para entender el funcionamiento básico. Se podría crear un controlador encargado de procesar la creación de un servicio, o utilizar el mismo controlador ya creado modificando un poco el código, en cuyo caso seguramente en el index.php deberíamos llamar a controllers/controlador.php
Un saludo y muchas gracias por comentar.