Estamos en la segunda mitad del 2015, y muchas personas insisten en hablar de la implementación del patrón MVC en frameworks como Laravel o Symfony, cuando éstos no son frameworks MVC. Pero antes de entrar en materia, aprendamos de una vez por todas qué es MVC:
¿Qué es MVC?
Trygve Reenskaug inventó el patrón MVC (Model View Controller) a finales de los 70 para su posterior implementación en Smalltalk-80. La idea de este patrón era ser usado en pequeños componentes. Imaginemos un checkbox, sí, uno como éste:
Este checkbox posee:
Un modelo: que se encarga de almancenar los datos del checkbox, en este caso un solo dato que puede ser verdadero (checked) o falso (not checked).
Una vista: la representación gráfica del checkbox, es decir una cajita, la vista por supuesto toma los datos del modelo para saber cómo debe ser representada (con o sin marca). El usuario por supuesto ve e interactúa con la aplicación a través de la vista.
Un controlador: El controlador se encarga de tomar una acción del usuario (por ejemplo el usuario presionó el checkbox) y actualizar el modelo (en este caso ahora el modelo contendrá «verdadero» porque el checkbox está presionado o volverá a «falso» si se presiona otra vez).
Una vez que se realicen cambios en el modelo, éste actualiza la vista.
Esto se puede representar de manera gráfica de esta forma (gráfico tomado de Wikipedia):
Puedes ver allí la relación entre las 3 capas, pero lo más importante: la forma como el usuario obtiene información de la vista y sus acciones son capturadas o procesadas por un controlador.
Ésta es la razón por la cuál hace años me costó tanto entender qué era MVC. Porque: MVC se creó con la idea de representar pequeños componentes dentro de una aplicación para desktop, no para representar aplicaciones web modernas.
MVC en la actualidad
Hoy en día, para desarrollar una aplicación web de forma exitosa, necesitamos mucho más que 3 capas. Por ejemplo en MVC:
- No tenemos una manera de representar las rutas que se encargan de analizar las URLs y asignarlas a un método o función,
- No tenemos forma de representar un middleware que restringe ciertas áreas de la aplicación basado en el estado del usuario
- Una aplicación moderna requiere mucho más que la representación de datos a través de un modelo
Me imagino que por ello en Wikipedia, así como en muchas otras partes de la web, han cambiado tantas veces el concepto de MVC, supongo que intentando (y fallando, espectacularmente) que éste refleje las necesidades de una aplicación moderna.
Por ejemplo en Wikipedia nos dicen que un modelo: «maneja directamente la data, lógica y reglas de la aplicación», la vista: «es la salida o representación gráfica de información (es decir, ¿Podría ser JSON o un diagrama?), un controlador: «acepta una entrada y la convierte en comandos para el modelo y la vista».
Estos conceptos son demasiado genéricos, y distan muchísimo de darte las herramientas que necesitas para construir aplicaciones avanzadas.
Por ejemplo, la mayoría cree que el «Modelo» es la «base de datos» pero el 90% de las aplicaciones requieren mucho más lógica que almacenar datos ¿Cierto?
Como mencionó Taylor ayer:
@Sileence and that there is no way to fit all aspects of robust web apps into one of Those 3 letters
— Taylor Otwell (@taylorotwell) August 20, 2015
«No hay manera de encapsular todos los aspectos de aplicaciones web robustas en esas 3 letras.»
Es por ello que frameworks como Symfony o Laravel NO son MVC.
Laravel NO es un framework MVC
¿No me crees? De hecho, le pregunté directamente a Taylor Otwell, creador de Laravel ¿Es Laravel MVC?:
@Sileence eh not really
— Taylor Otwell (@taylorotwell) August 20, 2015
De hecho si bien Laravel 4 incluía las 3 famosas carpetas controllers, models, views, en Laravel 5:
- Ya no encontrarás una carpeta «models», en vez de eso tienes una carpeta app/ donde puedes estructurar tu aplicación de la forma que tenga más sentido para tu proyecto.
- La carpeta Controllers es una pequeña parte de la capa «Http» que se encuentra dentro de app/. Junto a Controllers, tienes Middleware/ (middleware no se pluraliza), tienes el directorio Requests/ donde se albergan los FormRequests y tienes el archivo «routes.php»
- La carpeta «views/» se encuentra ahora dentro de resources/ y forma parte de los «recursos» para presentarle los datos al usuario (assets/ lang/), creo que esta capa es la que menos cambió, por así decirlo.
En la carpeta app/ también encontrarás otras capas como Eventos, Listeners, Excepciones, Jobs, etc.
Verás, aunque tu aplicación utilize Modelos, Vistas, y Controladores, no es MVC puesto que se requieren muchas más capas para poder organizar todos los aspectos característicos de tu aplicación, si no quieres terminar escribiendo código espagueti, claro está.
Esto es lo que sucedía con frameworks como CodeIgniter. ¿Has escrito una aplicación en CodeIgniter? Anda a verla un momento, abre sus controladores y sus modelos, al menos que sea una app super sencilla, superan las 100 líneas de código cada uno cierto? ¿Tu modelo Usuario tiene 1000 líneas de código? Te lo dije.
Seguir usando MVC y la resistencia al cambio
De pronto vuelves en ti y te encuentras en el medio del océano, tienes mucho frío y estás apunto de ahogarte cuando encuentras un pedazo de madera flotando ahí justo al lado de ti ¿Qué haces? Te aferras a él y logras salvar tu vida por unos minutos más.
El océano es la Web y el pedazo de madera es MVC, flotar es programar. MVC te permite programar aplicaciones web como un pedazo de madera te permite flotar ¿Fue creado para eso? No ¿Por qué lo usas? Era lo primero que se te atravesó.
La buena noticia es que estás en medio de una pesadilla, puedes despertar en cualquier momento.
¿Qué se necesita para crear aplicaciones web hoy en día?
De nuevo como comentó Taylor:
@montogeek @Sileence I’ve not seen any one «architecture» that is amazing for web dev. Just build apps in a sensible way
— Taylor Otwell (@taylorotwell) August 20, 2015
Lamentablemente no hay una respuesta única que sirva para todos los escenarios. Por eso aquí en Styde creamos tantos cursos de Laravel, y damos tantos enfoques diferentes y explicamos tantos patrones; porque a la hora de crear tu aplicación dependerá de ti armar el rompecabezas y decir, Ok, para esta aplicación necesito (o no) repositorios, necesito (o no) implementar estos middleware, debo usar interfaces e inyección de dependencias o con Facades me basta, etc. etc.
Una aplicación es la traducción informática de la solución a un problema real, y cuando estás traduciendo NO usas todas las palabras o construcciones gramaticales, sólo usas aquellas que necesitas, ¿Cierto?
¿Dónde puedo aprender nuevos patrones y alternativas a MVC?
Si quieres aprender Laravel por primera vez, puedes comenzar con nuestro curso gratuito Primeros pasos con Laravel 5.* donde aprenderás los conceptos básicos y esenciales para trabajar con Laravel desde su versión 5.1 hasta la versión 5.4.
Laravel está escrito usando todo el poder de la programación orientada a objetos en PHP, así que para dominar Laravel más que «MVC» es importante que domines conceptos, principios y el paradigma de la programación orientada a objetos como tal y para ello creamos un Curso dedicado de OOP en PHP.
Otro concepto o practica de desarrollo de suma importancia es el desarrollo con pruebas automatizadas. El framework Laravel está cubierto por cientos de pruebas automatizadas que se ejecutan cada vez que alguien hace una contribución al proyecto, de esta forma se garantiza y calidad del framework. Todos los desarrolladores profesionales de alto nivel escriben pruebas para sus aplicaciones y me atrevo a decir que no puedes considerarte un profesional hasta tanto no escribas pruebas automatizadas.
Aprende a escribir pruebas y desarrollar con TDD con nuestros curso de nivel intermedio Crea una aplicación con Laravel 5.3 y 5.4 y nuestro curso de nivel avanzado Creación de componentes para PHP.
Material relacionado
- Cómo y donde aprender Laravel
- 5 maneras de comprobar que escribes un buen PHP
- Aprende programación orientada a objetos con PHP
- Conversación con Taylor, en Twitter
- Video «Architecture, the Lost Years» de Robert C. Martin (Uncle Bob)
- Patrones SOLID y alternativas al MVC en Laravel (libro de Taylor Otwell del 2013)
¿Qué piensas?
¿Tienes alguna opinión adicional? Escríbenos un comentario, y por favor comparte el artículo.
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.