En este tutorial sobre el uso del MVC en PHP veremos de forma simple y clara que es el MVC, como funciona y como se implementa en PHP nativo sin frameworks.
¿Que es el patrón MVC?
El patrón de diseño (de software) MVC se encarga de separar la lógica de negocio de la interfaz de usuario y es el mas utilizado en aplicaciones web, framework, etc, ya que facilita la funcionalidad, mantenibilidad, y escalabilidad del sistema, de forma comoda y sencilla, a la vez que ayuda no mezclar lenguajes de programación en el mismo código, el conocido “código espagueti”.
MVC divide las aplicaciones en tres niveles de abstracción:
- Modelo: es la lógica de negocios. Es decir las clases y métodos que se comunican directamente con la base de datos.
- Vista: es la encargada de mostrar la información al usuario, con de forma gráfica y legible.
- Controlador: el intermediario entre la vista y el modelo, se encarga de controlar las interacciones del usuario en la vista, pide los datos al modelo y los devuelve de nuevo a la vista para que esta los muestre al usuario. Es decir las llamadas a clases y métodos, y los datos recibidos de formularios.
¿Como funciona el MVC?
El funcionamiento básico del patrón MVC, puede resumirse en:
- El usuario realiza una petición.
- El controlador captura la petición.
- Hace la llamada al modelo correspondiente.
- El modelo sera el encargado de interactuar con la base de datos.
- El controlador recibe la información y la enviá a la vista.
- La vista muestra la información.
Esquema muy claro del funcionamiento del MVC en PHP de phpzag.com
¿Como implementar el MVC en PHP?
Para implementar el MVC es imprescindible crear una estructura de ficheros parecida a esta:
Veamos un ejemplo típico del uso del MVC con PHP. Para comprenderlo seria ideal que supieras PHP Orientado a objetos y como funciona la extensión MySQLi
# index.php
<?php require_once("db/db.php"); require_once("controllers/personas_controller.php"); ?>
# db.php
<?php class Conectar{ public static function conexion(){ $conexion=new mysqli("localhost", "root", "", "mvc"); $conexion->query("SET NAMES 'utf8'"); return $conexion; } } ?>
# model/personas_model.php
<?php class personas_model{ private $db; private $personas; public function __construct(){ $this->db=Conectar::conexion(); $this->personas=array(); } public function get_personas(){ $consulta=$this->db->query("select * from personas;"); while($filas=$consulta->fetch_assoc()){ $this->personas[]=$filas; } return $this->personas; } } ?>
# contoller/personas_controller.php
<?php //Llamada al modelo require_once("models/personas_model.php"); $per=new personas_model(); $datos=$per->get_personas(); //Llamada a la vista require_once("views/personas_view.phtml"); ?>
El controlador debe tener siempre esta estructura llamada al modelo y debajo a la vista, si hubiera mas modelos y vistas se sigue haciendo así con todos.
# view/personas_view.phtml
<!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8" /> <title>Personas</title> </head> <body> <?php foreach ($datos as $dato) { echo $dato["nombre"]."<br/>"; } ?> </body> </html>
Los ficheros de la vista según el estándar de Zend Framework debemos usar .phtml, pero se podría sin ningún problema usar la extensión .php
Muchos dicen que es recomendable usar CamelCase en los nombres de los ficheros y las clases, a efectos prácticos da igual usarlo que no, incluso algunos frameworks como Codeigniter nos sugieren que usemos nombres como «wellcome_model» por eso no he utilizado CamelCase. Si puedes y quieres abusa del CamelCase, porque así lo dicen los estándares.
Esquema del ejemplo:
A partir de aquí ya sabemos se podría implementar un controlador frontal que cargue un controlador u otro en función de la url, etc, pero eso lo veremos en próximos capítulos. Mientras tanto puedes aprender mas sobre PHP, el MVC y los frameworks en mi curso gratuito de introducción a los framworks para PHP.