Modelo vista controlador en PHP

Si hay algo que me gusta de la programación web es que podemos encontrar un sin fin de opciones para desarrollar nuestras aplicaciones web, lenguajes de programación tanto web como móviles y tomadas de la mano con sus APIs, frameworks y ciertas herramientas que nos agiliza el proceso de desarrollo, pero hay algo que no debemos descuidar al momento de desarrollar nuestras aplicaciones es el de tener buenas prácticas, por ejemplo si hablamos en concreto del lenguaje de programación PHP nos da bastante libertad y fácilmente podemos descuidar el desarrollo de nuestro código obteniendo así uno desordenado y muchas veces mal aplicado.

Para solventar este tipo de incidentes existen patrones de desarrollo que nos ayudan a mantener un código mejor estructurado, anteriormente hablamos de la programación orientada a objetos (POO) que en si es un paradigma que nos permite modularizar, clasificar nuestras aplicaciones y es de gran importancia ya que comprendiendo este paradigma podemos hablar de estos patrones, uno de ellos es el patrón Modelo vista controlador (MVC) y ahora quiero hablarte de ello.


El modelo vista controlador es un patrón de arquitectura de software que nos aporta separando los datos de nuestra aplicación de la lógica y de la interfaz de usuario obteniendo así tres componentes relacionados entre si. Si bien la POO nos ayuda a clasificar nuestra aplicación, el MVC nos ayudará a separarlo por componentes (que desde ahora le llamaremos capas porque me parece un concepto más adecuado).

modelo vista controlador

A continuación paso a explicarte en que consiste cada una de estas capas:

Modelo: Es todo lo referente a la gestión de la información y la interacción con los datos de nuestra aplicación (comúnmente bases de datos) este modelo realizará acceso a dicha información como también podrá realizar actualizaciones y depuraciones de los datos gestionados. Toda petición de acceso a la información siempre pasará por esta capa.

Controlador: Este es el puente entre la vista y el modelo ya que el usuario solicitará información mediante la vista y este pasará por el controlador para posteriormente realizar la petición al modelo, habitualmente es llamado la capa de lógica del negocio.

Vista: Esta capa nos mostrará la información formateada y ordenada, es el resultado de todo lo que el modelo interaccione con los datos,  este lo muestra mediante la interfaz de usuario, habitualmente llamado la capa de presentación.

En la actualidad lenguajes de programación con alto peso utilizan este patrón, cada una de estas llevadas de la mano con sus frameworks, tal es el caso de PHP con frameworks como Laravel, Zend, Symfony, CakePHP, CodeIgniter, Prado, Yii son solo algunos de los muchos ya existentes que trabajan con este patrón, desde luego cada uno de estos tiene su manera de trabajarlo pero en si la esencia y el concepto siempre será el mismo.


¿Pero como aplico todo esto con PHP?

Para que todo esto quede mas claro que mejor plasmarlo con un ejemplo, si diste un vistazo los anteriores artículos he aplicado  un ejemplo sobre un restaurante para así mostrar la forma en que trabaja la POO, lo propio haré para mostrarte como trabaja el patrón de desarrollo MVC.

Modelo vista controlador

Nos encontramos en un restaurante que tiene variedad de platillos, cuando un comensal ingresa este solicita el menú, entonces se realizará una solicitud de los platillos disponibles en el restaurante, esta solicitud se lo realiza mediante el controlador para que  este mismo realice una petición al modelo, como este modelo es el encargado de interactuar con los datos entonces realizará una consulta a la base de datos de los platillos disponibles en el restaurante, una vez obtenido el resultado este se lo devolverá al usuario mediante la vista. Vamos a reflejar todo esto en código PHP, para que tu puedas seguir el procedimiento te lo mostraré por pasos:

1) Crearemos una estructura de base de datos simple, esto con fines prácticos para demostrar correcta funcionalidad:

Base de datos restaurant

La base de datos lo llamaremos restaurante y contendrá cuatro campos, que indican el id, nombre del platillo, su precio y su disponibilidad, entonces cuando el valor del campo disponible esté en 1 significa que si esta disponible de lo contrario si el valor es de 0 no estará disponible, en este ejemplo el único platillo que no esta disponible es el de chuleta con patatas, eso quiere decir que cuando el usuario realice una petición de los platillos disponibles tendrá que reflejarnos 3 (mariscos, lazaña y milaneza).

2) Creamos nuestro primer archivo index.php el cual contendrá una interfaz sencilla de bienvenida:

[html]

<!DOCTYPE html>
<html lang=»es»>
<head>
    <meta charset=»UTF-8″ />
    <title>Modelo-vista-controlador</title>
</head>
<body>
    <h1>Bienvenido al restaurant Chefcito</h1>
    <section>
        <a href=»controlador.php»>Solicite nuestro menú</a>
    </section>
</body>
</html>

 [/html]

Seguido de un titulo creamos un enlace para solicitar el menú del restaurante, si observas el enlace apunta a otro archivo llamado controlador.php

pantalla bienvenida restaurant

3) Creamos el archivo controlador.php, está demás explicar que este es el controlador de nuestra aplicación:

[php]

<?php
    require_once(«modelo.php»);
    $menu = new Platillo();
    $pd = $menu->lista_platillos();
    require_once(«vista.php»);
?>

[/php]

Si te das cuenta este archivo contiene unicamente código PHP ya que este nunca será mostrado al usuario, trabajará internamente y como bien mencione anteriormente este será el puente entre la vista y el modelo, primeramente realizamos una llamada al archivo modelo.php para rescatar la información de la petición realizada, posteriormente creamos un objeto de la clase Platillo y realizamos una llamada al método lista_platillo para almacenarlo en una variable $pd y finalmente hacemos una llamada al archivo vista.php

4) Creamos el archivo modelo.php

[php]

<?php
class Platillo
{
    private $platillo;
    private $dbh;

    public function __construct()
    {
        $this->platillo = array();
        $this->dbh = new PDO(‘mysql:host=localhost;dbname=restaurante’, «root», «»);
    }

    private function set_names()
    {
        return $this->dbh->query(«SET NAMES ‘utf8′»);
    }

    public function lista_platillos()
    {
        self::set_names();
        $sql=»select nombre, precio from platillos where disponible = 1″;
        foreach ($this->dbh->query($sql) as $res)
        {
            $this->platillo[]=$res;
        }
        return $this->platillo;
        $this->dbh=null;
    }
}
?>

[/php]

Imagino que este código ya se te hace familiar :-) (porque ya lo estudiamos en artículos anteriores) pero igual te lo voy a explicar.

Creamos una clase Platillo y dentro de la clase un constructor para inicializar los atributos ($platillo y $dbh) y también realizará la conexión a la base de datos mediante el objeto PDO (PHP Data Objects), posteriormente creamos dos métodos uno privado y el otro público, el primero únicamente realizará una consulta para evitar los problemas de tildes (SET NAMES ‘utf8’), el segundo método lista_platillos será la que recopile toda la información de platillos disponibles mediante una consulta a la base de datos.

5) Creamos el archivo vista.php

[html]

<!DOCTYPE html>
<html lang=»es»>
<head>
    <meta charset=»UTF-8″ />
    <title>Modelo-vista-controlador</title>
</head>
<body>
    <h1>Platillos disponibles</h1>
    <table border=»1″>
        <tr>
            <td><strong>Nombre platillo</strong></td>
            <td><strong>Precio platillo</strong></td>
        </tr>
        <?php
            for($i=0;$i<count($pd);$i++)
            {
                ?>
                    <tr>
                        <td><?php echo $pd[$i][«nombre»]; ?></td>
                        <td><?php echo $pd[$i][«precio»]; ?> USD.</td>
                    </tr>
                <?php
            }
        ?>
    </table>
</body>
</html>

[/html]

Este archivo será mostrado al usuario con la información procesada y bien formateada, mediante un ciclo for mostramos tanto el nombre como el precio de los platillos disponibles, el resultado en pantalla será el siguiente:

platillos disponibles restaurant

Y esa es la forma como trabaja este patrón de desarrollo MVC, puedes ver en el ejemplo como mantenemos mas estructurado y ordenado nuestro código separando cada labor en distintas capas. Todo lo anterior explicado es una forma nativa de trabajar con este patrón pero entenderlo es dar un gran paso para poder comprender mucho mejor como funciona un framework PHP.


Mi consejo…

Crea una estructura de directorios donde separes modelos de vistas y controladores para que de esa forma si tu aplicación crece sabrás donde se encuentra ubicado cada uno de los archivos. Si vas a utilizar funciones y estas serán llamadas continuamente por ejemplo una función que realice la conexión a la base de datos entonces crea una clase padre para que todos sus clases hijos hereden de ella, de esa forma optimizaras mas tu código.

Para finalizar solo me queda decir que lo primordial para comprender mejor el MVC es bastante práctica, si queremos adentrarnos al mundo de los frameworks PHP saber esto es fundamental de tal forma que si en algún momento tengamos que afrontar un proyecto que no requiera de un framework trabajar con un MVC nativo es una buena opción.

Si este articulo te pareció interesante compártelo para que así muchos conozcan la forma en que trabaja MVC, si tienes alguna duda o sugerencia no dudes en dejar un comentario. Comparto el código del ejemplo que realizamos con la base de datos para que tu mismo puedas probarlo, espero te sea muy útil 8-)

Saludos!!

Descargar código

firma emm

17 respuestas a «Modelo vista controlador en PHP»

    1. Hola Giovanni, gracias por comentar y me alegra mucho que te esté siendo muy útil los artículos, una vez que termines lo de POO y MVC te recomiendo el curso del framework CakePHP que voy publicando periódicamente, te dejo el enlace por si te interesa: Curso CakePHP. Saludos!!!

  1. Por favor me ayuda,
    Estoy con este error y no consigo resolver:

    Warning: Invalid argument supplied for foreach() in /home/****/public_html/modelo.php on line 21

    La línes 21:
    $sql=»select nombre, precio from platillos where disponible = 1″;

    Ya cambié las sentencias a mayúsculas SELECT, FROM.WHERE, mas sigue dando error.

    1. Hola Alfredo, no veo error alguno en tu consulta, quizá solo es un detalle de sintaxis pero como no veo tu código completo se me hace difícil saber donde esta la falla, lo que si puedes descargar el código del ejemplo, el enlace lo encuentras al final del artículo. Apoyate del código y cuéntame cómo te fue. Saludos y gracias por seguir mi trabajo.

  2. No me queda muy claro, en la pagina vista.php las variables $pd, no valen nada, en ningun lado … sin embargo en controlador.php las incluis via require, eso basta para que despues esten las variables con su contenido en la nueva pagina?

    1. La variable $pd realiza la llamada al método lista_platillos() para después realizar la iteración desde la vista, si crees que $pd no vale nada, intenta mostrar en tu vista un print_r() de la variable para que te convenzas lo que contiene la variable. Saludos y mas bien gracias a ti por seguir mi trabajo.

  3. Muy bueno, ya me va quedando mas claro la poo y el mvc, lo realice y cree una clase conexion para solamente realizar las consultas creando objetos de esa clase y funciono muy bien, muchas gracias por tus cursos, pronto empezare a adentrarme en los frameworks con tus cursos claro, sigue adelante!

    1. Es bueno saber de personas que valoran mi trabajo y me alegra que el contenido que comparto te sea muy útil. Te invito a seguir los cursos que están publicados tanto en mi blog como en mi canal de YouTube. Saludos!!!

  4. Una pregunta Edson, sabiendo que estoy casi ya preparado en poo y mvc, no a nivel senior pero si para entenderlo con que curso de framework me recomiendas que empiece? cakephp, symfony o cual? quedo a la espera de tu respuesta para empezar el curso de los que tienes publicados gracias.

  5. Muchas gracias por el tutorial.
    Estoy empezando en esto y me ha ayudado a comprender como funciona.
    Tengo una duda, que pasaría si en index hay dos opciones? Por ejemplo mostrar menu y mostrar chefs.
    Tendrías dos controladores ?( Uno para cada petición)
    O en el mismo controlador pondrías por ejemplo dos ‘if’ (uno por si la orden es mostrar menu y otro por si la orden es mostrar chefs).
    Gracias

    1. Hola Marco, si puedes usarlo en controladores distintos, de esa manera si tu aplicación crece y tengas que agregar mas funcionalidades entonces ya lo tendrías mas modular. Saludos!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *