El problema de las arquitecturas complejas
Las arquitecturas en el desarrollo de software, por ejemplo, la hexagonal, suenan muy bien en teoría: capas organizadas, comunicación estructurada, escalabilidad garantizada. En la práctica, se vuelven un laberinto de complejidad que pocos dominan realmente. Los foros están llenos de preguntas sobre cómo crear un servicio que respete las capas, cómo comunicar dominios, dónde poner cada pieza. Si tu arquitectura genera más dudas que soluciones, algo está fallando.
Llevo años aplicando técnicas más simples en proyectos medianos y grandes con resultados consistentemente buenos. No necesitas implementar todas a la vez; puedes empezar con una y añadir las demás progresivamente según tus necesidades.
Técnica 1: Actions - Libera tus controladores
El problema que resuelven
Controladores de 500, 800, hasta 1000 líneas que mezclan validación, lógica de negocio, envío de correos, manipulación de datos. Imposibles de testear, imposibles de mantener, imposibles de entender para alguien nuevo en el proyecto.
La solución con Actions
Una Action es una clase con una única responsabilidad. CreateUserAction solo crea usuarios. Simple, testeable, reutilizable desde controladores, jobs, comandos o donde necesites.
Cuando el proceso es complejo (crear usuario, enviar notificación, notificar admin, sincronizar con CRM), uso Actions compuestas con el patrón Pipeline. Cada paso es una clase independiente que recibe un passable con los datos compartidos. Todo dentro de una transacción, con manejo consistente de errores.
El resultado: controladores de pocas líneas que solo orquestan, Actions que solo hacen una cosa fáciles de testear unitariamente, y procesos complejos divididos en piezas manejables.
Aprende más sobre Actions en Laravel
Técnica 2: ViewModels - Datos estructurados para presentación
El problema que resuelven
Preparar datos para vistas o APIs genera código repetitivo y desorganizado. Los controladores crecen con lógica de presentación y cada vista requiere información diferente.
La solución con ViewModels
Un ViewModel es una clase dedicada exclusivamente a preparar datos para presentación. Usando la API de reflexión de PHP, los métodos públicos se convierten automáticamente en variables disponibles en la vista.
Funciona con Blade, Livewire, Vue, Inertia o APIs. Un lugar para toda la lógica de presentación, con herencia y composición cuando lo necesites.
Domina los ViewModels en Laravel
Técnica 3: Filtros con Pipeline - Búsquedas elegantes
El problema que resuelven
Búsquedas complejas terminan en controladores llenos de if anidados o scopes gigantescos en los modelos. Un modelo Usuario con 15 columnas puede necesitar diferentes combinaciones de filtros según el contexto.
La solución con Filtros y Pipeline
Cada filtro es una clase independiente: ActiveFilter, DateRangeFilter, PriceFilter. Usando el patrón Pipeline, compones los filtros que necesitas para cada contexto.
Un buscador del backoffice puede usar ciertos filtros, mientras que la API usa otros. Escribes cada filtro una vez, lo reutilizas donde necesites. Testeable individualmente, componible infinitamente.
Implementa Filtros Escalables en Laravel
Técnica 4: Modelos Organizados - Separación de responsabilidades
El problema que resuelven
Modelos de 500+ líneas mezclando relaciones, scopes, mutators, accessors, eventos, lógica de negocio. Conflictos constantes en Git, duplicación accidental de métodos, imposibles de navegar.
La solución: Concerns organizados
Separa responsabilidades sistemáticamente:
HasRelations: todas las relaciones en un traitHasAttributes: mutators y accessors separadosHasScopeso mejor aún, unBuilderpersonalizado para consultasModelo base abstracto con configuración
Modelo final solo con lógica de negocio esencial, limpio y claro
Beneficios comprobados de estas técnicas
Mantenibilidad: Código organizado en responsabilidades claras. Los cambios son predecibles y seguros.
Colaboración eficiente: Cuando alguien nuevo llega, puede entender la estructura en minutos. "Los filtros van aquí, las actions allá, los ViewModels manejan presentación".
Testing real: Clases pequeñas con una responsabilidad son fáciles de testear. Un test unitario para un filtro son 20 líneas. Para una action, 30. Coverage real, no solo pasar tests de feature.
Escalabilidad natural: El proyecto crece ordenadamente sin acumular deuda técnica.
Implementación gradual sin dolor
No necesitas refactorizar todo de golpe. Mi recomendación:
Extrae las actions de tus controladores más complejos
Implementa ViewModels en las pantallas con más datos
Refactoriza búsquedas existentes con Filtros y Pipeline
Organiza modelos grandes con traits especializados
Cada técnica es independiente. Puedes implementar solo las que necesites, cuando las necesites.
La diferencia entre código que funciona y código profesional
He trabajado en proyectos con métodos de 800 líneas donde buscar algo es imposible, testear es impensable, y refactorizar requeriría meses, por no decir la incertidumbre de romper todo al realizar cualquier cambio. Ese es el precio de no organizarse desde el inicio.
Estas técnicas no son arquitecturas complejas. Son patrones simples, probados, que funcionan. No generan debates filosóficos sobre qué capa corresponde a cada cosa. Son predecibles: si necesitas lógica de negocio, creas una action; si necesitas presentación, un ViewModel; si necesitas búsqueda, filtros con pipeline; si tu modelo crece, lo organizas con traits.
El código limpio no es un lujo. Es un regalo para tu yo del futuro y tu equipo. No se trata de que luzca mejor, sino de que sea mantenible, testeable y comprensible dentro de seis meses.
Curso Laravel 12
Completo 2026
El único curso 100% actualizado que incluye Laravel 12, Livewire 3, Vue 3, React 19 e Inertia 2. Aprende con proyectos reales y las últimas funcionalidades.
star Incluido en cualquier suscripción