En el mundo del desarrollo, cada cierto tiempo surgen nuevas corrientes de arquitectura que tratan de demostrar las bondades de un nuevo lenguaje de programación o un nuevo framework.
Muchas de estas teorías, tal y como llegan se van, por eso llaman la atención aquellas que perduran en el tiempo. Este es el caso de MVC el patrón de desarrollo que implementan la mayor parte de los framework diseñados para crear aplicaciones web, como Laravel.
Un paseo por la historia
Mucho antes de que existiera internet ya se hacían programas que solucionaban tareas cotidianas, en su mayoría relacionadas con la industria o con la gestión económica. Con el rápido crecimiento de las empresas que poco a poco introducían la programación para resolver parte de su problemática, fue creciendo el código de una forma no siempre adecuada. Hoy lo llamaríamos spaghetti-code, a mediados del siglo pasado, era simplemente código complejo.
Nos tenemos que remontar a la década de los setenta para encontrar la primera referencia a MVC, donde aparece como una novedad del lenguaje Smalltalk. Este gran desconocido de los lenguajes de programación, salió poco del ámbito educativo, pero supuso un antes y un después en la industria del software, al ser el primer lenguaje de programación orientado a objetos. También es conocido por ser la base en la que se inspiran lenguajes punteros actuales como Java y la inspiración en cuanto a la orientación a objetos de C++, PHP, Python, JavaScript o Dart.
En el mundo del desarrollo web, la elección de un marco de trabajo adecuado puede marcar la diferencia entre un proyecto bien estructurado y mantenible y uno que se convierta en una pesadilla de mantenimiento a largo plazo. Entre los framework más populares, Laravel destaca como una opción líder gracias a su elegante arquitectura y su conjunto de características ayuda al desarrollo.
¿En qué consiste MVC?
MVC son las siglas de las tres capas o bloques de operación en los que se basa esta arquitectura. Y con esta frase hemos dicho lo más importante: es una arquitectura de capas independientes.
Cada una de las capas es un conjunto de clases o scripts de código que se encargan de realizar una funcionalidad principal dentro de cualquier aplicación. Entre sí tienen un acople ligero, lo que permite cambiar una de ellas por una nueva versión de código con gran facilidad e incluso, tener cada una de las capas desarrolladas con un lenguaje de programación diferente y en un servidor distinto.
Toda una revolución frente a otras arquitecturas, como la monolítica, donde el acoplamiento de código es total y no se entiende una presentación de información sin el acceso a datos.
Estas tres capas, a su vez, se dividen en módulos o paquetes de menor entidad y mayor acoplamiento entre sí, que se encarga cada uno de ellos de realizar una funcionalidad muy específica dentro de la aplicación (validación de datos, control de acceso, etc).
Y cada uno de estos módulos o paquetes, se pueden seguir dividiendo si lo necesitamos. Es decir, tiene una escalabilidad potencialmente infinita. Por este motivo, fue el patrón adoptado por Laravel para su funcionamiento. PHP estaba ampliamente extendido y su mayor problema pasaba a ser la proliferación de código farragoso difícil de mantener. En este sentido, el orden y la estructuración de MVC en Laravel logra que aplicaciones complejas sean más sencillas de mantener y evolucionar.
¿Qué hace cada una de estas capas?
Las tres capas principales responden a cada una de las necesidades básicas de cualquier aplicación:
Modelo: Es la capa encargada de administrar los datos con los que trabaja la aplicación. Estos datos pueden estar en una base de datos relacional, documental, ficheros de texto, una API externa… En esta capa solamente se obtienen los datos de forma nativa, sin validaciones ni conversiones. Hace transparente la tecnología de almacenamiento, pero también la estructura, puesto que no es imprescindible que la estructura de los objetos con los que trabaja sea idéntica a la estructura de datos en la que se persiste esta información. Dentro de Laravel, es la capa más liviana si seguimos los estándares de configuración y nomenclatura, puesto que el propio framework se encarga del acceso a los datos gracias al ORM Eloquent, que se ocupa de la manipulación de los objetos necesarios con unas pocas líneas de código.
Vista: Es la capa de presentación. Puede ser una única capa que se adapte a diferentes dispositivos o podemos tener una Vista por cada tipología de dispositivo. En el caso de aplicaciones más complejas, nos decantaremos por esta segunda opción creando frontales específicos para una web, una aplicación móvil o un display de un electrodoméstico inteligente. Blade es la respuesta de Laravel para la creación de interfaces visuales y si queremos dotarlas de reactividad, también podemos incorporar Livewire.
Artículo recomendado: Reactividad en Laravel con Livewire
Controlador: Es la capa intermediaria, encargada de manipular la información y aplicar todas las lógicas de negocio que permiten transformar los datos en origen a información compleja que pueda ser presentada a un usuario. En las aplicaciones empresariales suele ser el lugar donde realizamos el código más complejo. Es tan importante este bloque, que en Laravel está dentro de la carpeta App.
Para complementar este patrón, Laravel aporta algún elemento adicional, con un enrutado dinámico, protección de sitios cruzados o seguridad de acceso a datos.
10 ventajas de MVC (y una de regalo)
El patrón (o arquitectura) MVC aporta una solución integral a la creación de cualquier aplicación empresarial, independientemente de su tamaño, complejidad o cometido. Las ventajas son muchas, pero por no hacer muy larga la lista vamos a reducirla tanto como sea posible
1 – Hazlo fácil: Están muy de moda, pero las arquitecturas hexagonales son complejas y esto supone una barrera de entrada muy grande para los perfiles junior e incluso perfiles con experiencia que desean adoptar nuevos modelos de arquitectura. En cambio, el MVC es sencillo de aplicar, la complejidad se encuentra en la creación de las clases que forman parte del core de la arquitectura, algo que ya viene incorporado en Laravel durante la creación del proyecto.
2 – Vive en comunidad: Trabajar sólo y sin apoyos es muy difícil, por lo que es necesario poder disponer de una comunidad detrás que permita un crecimiento o evolución del modelo. En esta línea, arquitecturas complejas o muy específicas de un lenguaje de programación suelen tener una comunidad pequeña y poco colaborativa. En el caso de MVC no es así, hay una comunidad tan amplia como la de cualquier lenguajes de desarrollo puntero y esto es porque la utilizan en su día a día un altísimo volumen de desarrolladores, ya que no está limitado por el lenguaje de programación ni por el nivel de experiencia del desarrollador.
3 – Cada código en su sitio: El mayor problema de PHP (y de otros lenguajes flexibles como JavaScript), reside en que permite crear un código farragoso en el que se mezclan distintas responsabilidades y acceso a diferentes elementos. MVC está modularizado y tiende a compartimentar incluso de una forma excesiva, logrando códigos sencillos y muy estructurados que permiten de un vistazo seguir el flujo que implementa el código en todo momento.
4 – Hazlo una vez y úsalo muchas: El código modularizado con de MVC, además permite crear múltiples scripts que son totalmente reutilizables y ampliables. De tal manera que cuando creas una funcionalidad compleja, la podrás reutilizar dentro de tu aplicación actual y, además, podrás portarla a cualquier otra aplicación que vayas a desarrollar en el futuro con muy pocas o ninguna modificación.
5 – El cielo es el límite: La escalabilidad está intrínseca en MVC, pudiendo adaptarse a pequeños proyectos personales y a grandes desarrollos empresariales. Permite crear puntos de entrada diferentes para admitir peticiones desde distintos consumidores: web, app y APIs.
6 – Probar es más fácil: Cada capa puede ser desarrollada de forma independiente y también probada. De hecho, en la base de MVC está poder sustituir una capa por otra forma diferente de entender el código, incluso la tecnología que hay detrás. Ejecutar un mayor volumen de pruebas unitarias automatizadas, hará tu código más robusto.
7 – Interfaces flexibles: La capa frontal puede ser sustituida por otra diferente en cualquier momento. Pero aún hay más, si quieres optimizar al máximo tu presentación, puedes llegar a desarrollar diferentes frontales para cada uno de los dispositivos que se puedan conectar a tu aplicación, casi sin esfuerzo.
8 – Mejora continua: Si tus requisitos cambian, ya no vas a enfadarte tanto con tu Product Owner, puesto que la separación de responsabilidades de MVC te va a permitir adaptarte con facilidad al cambio, modificando solamente la parte afectada en menos tiempo que en otro tipo de arquitecturas más acopladas con los datos manejados (¿te suena puertos y controladores?).
9 – Soporte: No hay una gran empresa detrás de Laravel, como sí tienen otros lenguajes de programación, pero ni falta que hace. Linux, tampoco tiene una gran empresa detrás y el crecimiento de internet no puede ser entendido sin Linux, al igual que nos pasará en unos años con Laravel. La falta de esa gran empresa detrás está cubierta de forma más que solvente con un soporte basado en la comunidad y en empresas de un gran tamaño que están interesadas en hacer crecer el código abierto para desarrollar sus soluciones.
10 – Compatible con nuevas tecnologías: Si tienes una aplicación legacy puedes sustituirla progresivamente por nuevos desarrollos, porque no hay limitación de tecnología por capa. Cada responsabilidad puede ser implementada potencialmente en una tecnología diferente, no obstante, si puedes utilizar siempre Laravel, notarás los beneficios del framework más utilizado en el lenguaje que domina internet.
Y una de regalo
Por si te faltaba todavía una razón de peso, aquí viene la definitiva: es 100% Laravel y Laravel es 100% MVC.
Entender Laravel sin MVC es inviable, así que si tu objetivo es trabajar con el lenguaje de programación más extendido en el desarrollo de backend para web (76% de las webs están desarrolladas con PHP)